From e1dd18f78913926b896c58c479926f086184be58 Mon Sep 17 00:00:00 2001 From: ci Date: Thu, 14 Sep 2023 15:42:46 +0200 Subject: [PATCH] copy examples and dist --- .eslintrc.cjs | 38 - .gitignore | 9 - .prettierrc.json | 7 - .vscode/launch.json | 17 - CHANGELOG.md | 4 - LICENSE | 10 - README.md | 176 - commit.txt | 1 + config/rollup.config.build.js | 3 - config/rollup.config.dev.js | 29 - config/rollup.config.js | 49 - dist/iink.d.ts | 1253 + dist/iink.d.ts.map | 1 + dist/iink.esm.js | 2 + dist/iink.esm.js.map | 1 + dist/iink.min.js | 2 + dist/iink.min.js.map | 1 + examples/server-configuration.json | 8 +- favicon.ico | Bin 318 -> 0 bytes index.html | 1 + jest.integration.config.js | 30 - jest.unit.config.js | 42 - package-lock.json | 21241 ---------------- package.json | 81 - plugins/typdoc-default-object.ts | 42 - preview.gif | Bin 190750 -> 0 bytes src/@types/Behaviors.d.ts | 63 - src/@types/Configuration.d.ts | 27 - .../configuration/EventConfiguration.d.ts | 4 - .../configuration/GrabberConfiguration.d.ts | 11 - .../RecognitionConfiguration.d.ts | 47 - .../configuration/RenderingConfiguration.d.ts | 20 - .../configuration/ServerConfiguration.d.ts | 39 - .../configuration/TriggerConfiguration.d.ts | 14 - .../configuration/UndoRedoConfiguration.d.ts | 4 - src/@types/configuration/index.ts | 8 - .../recognition/ConvertConfiguration.d.ts | 4 - .../recognition/DiagramConfiguration.d.ts | 19 - .../recognition/EraserConfiguration.d.ts | 4 - .../recognition/ExportConfiguration.d.ts | 37 - .../recognition/MarginConfiguration.d.ts | 7 - .../recognition/MathConfiguration.d.ts | 36 - .../recognition/RawContentConfiguration.d.ts | 15 - .../recognition/TextConfiguration.d.ts | 21 - src/@types/configuration/recognition/index.ts | 8 - src/@types/geometry.ts | 14 - src/@types/grabber/Grabber.d.ts | 13 - src/@types/index.ts | 10 - src/@types/model/Model.d.ts | 94 - src/@types/model/RecognitionPositions.d.ts | 5 - src/@types/model/Stroke.d.ts | 30 - src/@types/model/index.ts | 3 - src/@types/modules.d.ts | 22 - src/@types/recognizer/Recognizer.d.ts | 7 - src/@types/recognizer/RestRecognizer.d.ts | 26 - src/@types/recognizer/WSRecognizer.d.ts | 96 - src/@types/recognizer/index.ts | 3 - src/@types/renderer/Symbol.d.ts | 67 - src/@types/style/PenStyle.d.ts | 14 - src/@types/style/Theme.d.ts | 23 - src/@types/style/index.ts | 2 - src/@types/undo-redo/UndoRedoContext.d.ts | 10 - src/Constants.ts | 135 - src/Editor.ts | 420 - src/behaviors/RestBehaviors.ts | 283 - src/behaviors/WSBehaviors.ts | 287 - src/behaviors/index.ts | 2 - src/configuration/Configuration.ts | 81 - src/configuration/DefaultConfiguration.ts | 156 - src/configuration/index.ts | 3 - src/event/InternalEvent.ts | 135 - src/event/PublicEvent.ts | 73 - src/event/index.ts | 2 - src/grabber/PointerEventGrabber.ts | 120 - src/iink.css | 328 - src/iink.ts | 47 - src/model/Model.ts | 235 - src/model/Stroke.ts | 45 - src/model/index.ts | 2 - src/recognizer/CryptoHelper.ts | 7 - src/recognizer/RestRecognizer.ts | 256 - src/recognizer/WSRecognizer.ts | 716 - src/recognizer/index.ts | 3 - src/renderer/QuadraticUtils.ts | 31 - src/renderer/canvas/CanvasRenderer.ts | 113 - .../canvas/CanvasRendererShapeSymbol.ts | 190 - .../canvas/CanvasRendererStrokeSymbol.ts | 8 - .../canvas/CanvasRendererTextSymbol.ts | 74 - src/renderer/canvas/CanvasStroker.ts | 95 - src/renderer/canvas/index.ts | 5 - src/renderer/index.ts | 3 - src/renderer/svg/SVGStroker.ts | 103 - src/renderer/svg/WSSVGRenderer.ts | 192 - src/renderer/svg/index.ts | 2 - src/smartguide/SmartGuide.ts | 410 - src/style/DefaultPenStyle.ts | 3 - src/style/DefaultTheme.ts | 22 - src/style/StyleHelper.ts | 51 - src/style/StyleManager.ts | 58 - src/style/index.ts | 4 - src/undo-redo/UndoRedoContext.ts | 22 - src/undo-redo/UndoRedoManager.ts | 92 - src/undo-redo/index.ts | 2 - src/utils/DeferredPromise.ts | 32 - src/utils/MergeHelper.ts | 26 - src/utils/font.ts | 15 - src/utils/geometric.ts | 7 - src/utils/index.ts | 5 - src/utils/language.ts | 12 - src/utils/version.ts | 14 - test/.eslintrc.js | 14 - test/integration/01-home/home.test.js | 88 - test/integration/02-rest/rest-diagram.test.js | 166 - test/integration/02-rest/rest-math.test.js | 149 - test/integration/02-rest/rest-text.test.js | 173 - .../websocket-export-on-demand.test.js | 31 - .../websocket-handle_errors.test.js | 17 - .../websocket-math-custom-resources.test.js | 90 - .../websocket-math-eraser.test.js | 18 - .../websocket-math-import-jiix.test.js | 25 - .../websocket-math-inside-page.test.js | 105 - .../03-websocket/websocket-math.test.js | 313 - .../websocket-text-custom-lexicon.test.js | 42 - .../websocket-text-custom-resources.test.js | 29 - ...socket-text-customize-stroke-style.test.js | 113 - .../03-websocket/websocket-text-erase.test.js | 74 - .../websocket-text-file-export.test.js | 71 - .../websocket-text-highlight-words.test.js | 140 - .../websocket-text-iink-no-guides.test.js | 38 - .../websocket-text-iink-search.test.js | 47 - .../websocket-text-import-content.test.js | 53 - .../websocket-text-interact.test.js | 107 - .../websocket-text-local-storage.test.js | 46 - .../websocket-text-multiple-inputs.test.js | 111 - .../websocket-text-pointer-events.test.js | 38 - .../03-websocket/websocket-text.test.js | 198 - .../integration/_partials/nav-actions-test.js | 89 - test/integration/helper.js | 244 - test/integration/jest.setup.js | 6 - .../strokes/CustomLexicon/claclacla.json | 116 - .../strokes/CustomLexicon/jilop.json | 46 - .../strokes/CustomLexicon/klopmo.json | 127 - test/integration/strokes/Interact/aires.json | 26 - test/integration/strokes/Interact/buenos.json | 32 - .../strokes/Interact/buenosAires.json | 998 - test/integration/strokes/Interact/madrid.json | 54 - test/integration/strokes/Interact/paris.json | 24 - test/integration/strokes/Interact/rome.json | 40 - test/integration/strokes/Interact/tokyo.json | 42 - test/integration/strokes/abrausorus.json | 69 - test/integration/strokes/equation1.json | 402 - test/integration/strokes/equation2.json | 67 - test/integration/strokes/fence.json | 466 - test/integration/strokes/h.json | 12 - test/integration/strokes/hello.json | 264 - test/integration/strokes/helloHowAreYou.json | 762 - test/integration/strokes/helloOneStroke.json | 442 - .../strokes/helloOneStrokeSurrounded.json | 70 - test/integration/strokes/helloStrike.json | 410 - test/integration/strokes/line.json | 56 - .../strokes/multiple-inputs/1943.json | 688 - .../strokes/multiple-inputs/1993.json | 722 - .../centralProcessingUnit.json | 2102 -- test/integration/strokes/one.json | 93 - test/integration/strokes/ponyErase.json | 434 - test/integration/strokes/rectangle.json | 338 - test/integration/strokes/sum.json | 330 - test/integration/strokes/sumSimple.json | 101 - test/integration/strokesDatas.js | 627 - .../00-DefaultConfiguration.test.ts | 145 - .../00-configuration/01-Configuration.test.ts | 190 - .../01-grabber/00-PointerEventGrabber.test.ts | 281 - test/unit/02-model/00-Stroke.test.ts | 46 - test/unit/02-model/01-Model.test.ts | 590 - .../03-renderer/00-QuadraticUtils.test.ts | 45 - .../03-renderer/01-CanvasRenderer.test.ts | 51 - .../unit/03-renderer/02-CanvasStroker.test.ts | 34 - .../03-CanvasRendererShapeSymbol.test.ts | 63 - .../04-CanvasRendererStrokeSymbol.test.ts | 55 - .../unit/03-renderer/05-WSSVGRenderer.test.ts | 530 - test/unit/03-renderer/06-SVGStroker.test.ts | 52 - test/unit/04-style/00-StyleHelper.test.ts | 120 - test/unit/04-style/01-StyleManager.test.ts | 112 - .../05-recognizer/00-CryptoHelper.test.ts | 12 - .../05-recognizer/01-RestRecognizer.test.ts | 121 - .../05-recognizer/02-WSRecognizer.test.ts | 1060 - .../06-undo-redo/00-UndoRedoContext.test.ts | 26 - .../06-undo-redo/01-UndoRedoManager.test.ts | 241 - .../07-behaviors/00-RestBehaviors.test.ts | 208 - test/unit/07-behaviors/01-WSBehaviors.test.ts | 818 - .../unit/08-smart-guide/00-SmartGuide.test.ts | 248 - test/unit/09-event/00-PublicEvent.test.ts | 138 - test/unit/09-event/01-InternalEvent.test.ts | 97 - test/unit/99-iink/00-Editor.test.ts | 698 - test/unit/99-iink/01-utils.test.ts | 194 - test/unit/99-iink/02-Iink.test.ts | 83 - test/unit/_dataset/configuration.dataset.ts | 209 - test/unit/jest.setup.js | 1 - test/unit/utils/PointerEventFake.ts | 84 - test/unit/utils/helpers.ts | 4 - tsconfig.json | 47 - typedoc.json | 45 - yarn.lock | 5749 ----- 203 files changed, 1266 insertions(+), 52528 deletions(-) delete mode 100644 .eslintrc.cjs delete mode 100644 .gitignore delete mode 100644 .prettierrc.json delete mode 100644 .vscode/launch.json delete mode 100644 CHANGELOG.md delete mode 100644 LICENSE delete mode 100644 README.md create mode 100644 commit.txt delete mode 100644 config/rollup.config.build.js delete mode 100644 config/rollup.config.dev.js delete mode 100644 config/rollup.config.js create mode 100644 dist/iink.d.ts create mode 100644 dist/iink.d.ts.map create mode 100644 dist/iink.esm.js create mode 100644 dist/iink.esm.js.map create mode 100644 dist/iink.min.js create mode 100644 dist/iink.min.js.map delete mode 100644 favicon.ico create mode 100644 index.html delete mode 100644 jest.integration.config.js delete mode 100644 jest.unit.config.js delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 plugins/typdoc-default-object.ts delete mode 100644 preview.gif delete mode 100644 src/@types/Behaviors.d.ts delete mode 100644 src/@types/Configuration.d.ts delete mode 100644 src/@types/configuration/EventConfiguration.d.ts delete mode 100644 src/@types/configuration/GrabberConfiguration.d.ts delete mode 100644 src/@types/configuration/RecognitionConfiguration.d.ts delete mode 100644 src/@types/configuration/RenderingConfiguration.d.ts delete mode 100644 src/@types/configuration/ServerConfiguration.d.ts delete mode 100644 src/@types/configuration/TriggerConfiguration.d.ts delete mode 100644 src/@types/configuration/UndoRedoConfiguration.d.ts delete mode 100644 src/@types/configuration/index.ts delete mode 100644 src/@types/configuration/recognition/ConvertConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/DiagramConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/EraserConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/ExportConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/MarginConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/MathConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/RawContentConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/TextConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/index.ts delete mode 100644 src/@types/geometry.ts delete mode 100644 src/@types/grabber/Grabber.d.ts delete mode 100644 src/@types/index.ts delete mode 100644 src/@types/model/Model.d.ts delete mode 100644 src/@types/model/RecognitionPositions.d.ts delete mode 100644 src/@types/model/Stroke.d.ts delete mode 100644 src/@types/model/index.ts delete mode 100644 src/@types/modules.d.ts delete mode 100644 src/@types/recognizer/Recognizer.d.ts delete mode 100644 src/@types/recognizer/RestRecognizer.d.ts delete mode 100644 src/@types/recognizer/WSRecognizer.d.ts delete mode 100644 src/@types/recognizer/index.ts delete mode 100644 src/@types/renderer/Symbol.d.ts delete mode 100644 src/@types/style/PenStyle.d.ts delete mode 100644 src/@types/style/Theme.d.ts delete mode 100644 src/@types/style/index.ts delete mode 100644 src/@types/undo-redo/UndoRedoContext.d.ts delete mode 100644 src/Constants.ts delete mode 100644 src/Editor.ts delete mode 100644 src/behaviors/RestBehaviors.ts delete mode 100644 src/behaviors/WSBehaviors.ts delete mode 100644 src/behaviors/index.ts delete mode 100644 src/configuration/Configuration.ts delete mode 100644 src/configuration/DefaultConfiguration.ts delete mode 100644 src/configuration/index.ts delete mode 100644 src/event/InternalEvent.ts delete mode 100644 src/event/PublicEvent.ts delete mode 100644 src/event/index.ts delete mode 100644 src/grabber/PointerEventGrabber.ts delete mode 100644 src/iink.css delete mode 100644 src/iink.ts delete mode 100644 src/model/Model.ts delete mode 100644 src/model/Stroke.ts delete mode 100644 src/model/index.ts delete mode 100644 src/recognizer/CryptoHelper.ts delete mode 100644 src/recognizer/RestRecognizer.ts delete mode 100644 src/recognizer/WSRecognizer.ts delete mode 100644 src/recognizer/index.ts delete mode 100644 src/renderer/QuadraticUtils.ts delete mode 100644 src/renderer/canvas/CanvasRenderer.ts delete mode 100644 src/renderer/canvas/CanvasRendererShapeSymbol.ts delete mode 100644 src/renderer/canvas/CanvasRendererStrokeSymbol.ts delete mode 100644 src/renderer/canvas/CanvasRendererTextSymbol.ts delete mode 100644 src/renderer/canvas/CanvasStroker.ts delete mode 100644 src/renderer/canvas/index.ts delete mode 100644 src/renderer/index.ts delete mode 100644 src/renderer/svg/SVGStroker.ts delete mode 100644 src/renderer/svg/WSSVGRenderer.ts delete mode 100644 src/renderer/svg/index.ts delete mode 100644 src/smartguide/SmartGuide.ts delete mode 100644 src/style/DefaultPenStyle.ts delete mode 100644 src/style/DefaultTheme.ts delete mode 100644 src/style/StyleHelper.ts delete mode 100644 src/style/StyleManager.ts delete mode 100644 src/style/index.ts delete mode 100644 src/undo-redo/UndoRedoContext.ts delete mode 100644 src/undo-redo/UndoRedoManager.ts delete mode 100644 src/undo-redo/index.ts delete mode 100644 src/utils/DeferredPromise.ts delete mode 100644 src/utils/MergeHelper.ts delete mode 100644 src/utils/font.ts delete mode 100644 src/utils/geometric.ts delete mode 100644 src/utils/index.ts delete mode 100644 src/utils/language.ts delete mode 100644 src/utils/version.ts delete mode 100644 test/.eslintrc.js delete mode 100644 test/integration/01-home/home.test.js delete mode 100644 test/integration/02-rest/rest-diagram.test.js delete mode 100644 test/integration/02-rest/rest-math.test.js delete mode 100644 test/integration/02-rest/rest-text.test.js delete mode 100644 test/integration/03-websocket/websocket-export-on-demand.test.js delete mode 100644 test/integration/03-websocket/websocket-handle_errors.test.js delete mode 100644 test/integration/03-websocket/websocket-math-custom-resources.test.js delete mode 100644 test/integration/03-websocket/websocket-math-eraser.test.js delete mode 100644 test/integration/03-websocket/websocket-math-import-jiix.test.js delete mode 100644 test/integration/03-websocket/websocket-math-inside-page.test.js delete mode 100644 test/integration/03-websocket/websocket-math.test.js delete mode 100644 test/integration/03-websocket/websocket-text-custom-lexicon.test.js delete mode 100644 test/integration/03-websocket/websocket-text-custom-resources.test.js delete mode 100644 test/integration/03-websocket/websocket-text-customize-stroke-style.test.js delete mode 100644 test/integration/03-websocket/websocket-text-erase.test.js delete mode 100644 test/integration/03-websocket/websocket-text-file-export.test.js delete mode 100644 test/integration/03-websocket/websocket-text-highlight-words.test.js delete mode 100644 test/integration/03-websocket/websocket-text-iink-no-guides.test.js delete mode 100644 test/integration/03-websocket/websocket-text-iink-search.test.js delete mode 100644 test/integration/03-websocket/websocket-text-import-content.test.js delete mode 100644 test/integration/03-websocket/websocket-text-interact.test.js delete mode 100644 test/integration/03-websocket/websocket-text-local-storage.test.js delete mode 100644 test/integration/03-websocket/websocket-text-multiple-inputs.test.js delete mode 100644 test/integration/03-websocket/websocket-text-pointer-events.test.js delete mode 100644 test/integration/03-websocket/websocket-text.test.js delete mode 100644 test/integration/_partials/nav-actions-test.js delete mode 100644 test/integration/helper.js delete mode 100644 test/integration/jest.setup.js delete mode 100644 test/integration/strokes/CustomLexicon/claclacla.json delete mode 100644 test/integration/strokes/CustomLexicon/jilop.json delete mode 100644 test/integration/strokes/CustomLexicon/klopmo.json delete mode 100644 test/integration/strokes/Interact/aires.json delete mode 100644 test/integration/strokes/Interact/buenos.json delete mode 100644 test/integration/strokes/Interact/buenosAires.json delete mode 100644 test/integration/strokes/Interact/madrid.json delete mode 100644 test/integration/strokes/Interact/paris.json delete mode 100644 test/integration/strokes/Interact/rome.json delete mode 100644 test/integration/strokes/Interact/tokyo.json delete mode 100644 test/integration/strokes/abrausorus.json delete mode 100644 test/integration/strokes/equation1.json delete mode 100644 test/integration/strokes/equation2.json delete mode 100644 test/integration/strokes/fence.json delete mode 100644 test/integration/strokes/h.json delete mode 100644 test/integration/strokes/hello.json delete mode 100644 test/integration/strokes/helloHowAreYou.json delete mode 100644 test/integration/strokes/helloOneStroke.json delete mode 100644 test/integration/strokes/helloOneStrokeSurrounded.json delete mode 100644 test/integration/strokes/helloStrike.json delete mode 100644 test/integration/strokes/line.json delete mode 100644 test/integration/strokes/multiple-inputs/1943.json delete mode 100644 test/integration/strokes/multiple-inputs/1993.json delete mode 100644 test/integration/strokes/multiple-inputs/centralProcessingUnit.json delete mode 100644 test/integration/strokes/one.json delete mode 100644 test/integration/strokes/ponyErase.json delete mode 100644 test/integration/strokes/rectangle.json delete mode 100644 test/integration/strokes/sum.json delete mode 100644 test/integration/strokes/sumSimple.json delete mode 100644 test/integration/strokesDatas.js delete mode 100644 test/unit/00-configuration/00-DefaultConfiguration.test.ts delete mode 100644 test/unit/00-configuration/01-Configuration.test.ts delete mode 100644 test/unit/01-grabber/00-PointerEventGrabber.test.ts delete mode 100644 test/unit/02-model/00-Stroke.test.ts delete mode 100644 test/unit/02-model/01-Model.test.ts delete mode 100644 test/unit/03-renderer/00-QuadraticUtils.test.ts delete mode 100644 test/unit/03-renderer/01-CanvasRenderer.test.ts delete mode 100644 test/unit/03-renderer/02-CanvasStroker.test.ts delete mode 100644 test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts delete mode 100644 test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts delete mode 100644 test/unit/03-renderer/05-WSSVGRenderer.test.ts delete mode 100644 test/unit/03-renderer/06-SVGStroker.test.ts delete mode 100644 test/unit/04-style/00-StyleHelper.test.ts delete mode 100644 test/unit/04-style/01-StyleManager.test.ts delete mode 100644 test/unit/05-recognizer/00-CryptoHelper.test.ts delete mode 100644 test/unit/05-recognizer/01-RestRecognizer.test.ts delete mode 100644 test/unit/05-recognizer/02-WSRecognizer.test.ts delete mode 100644 test/unit/06-undo-redo/00-UndoRedoContext.test.ts delete mode 100644 test/unit/06-undo-redo/01-UndoRedoManager.test.ts delete mode 100644 test/unit/07-behaviors/00-RestBehaviors.test.ts delete mode 100644 test/unit/07-behaviors/01-WSBehaviors.test.ts delete mode 100644 test/unit/08-smart-guide/00-SmartGuide.test.ts delete mode 100644 test/unit/09-event/00-PublicEvent.test.ts delete mode 100644 test/unit/09-event/01-InternalEvent.test.ts delete mode 100644 test/unit/99-iink/00-Editor.test.ts delete mode 100644 test/unit/99-iink/01-utils.test.ts delete mode 100644 test/unit/99-iink/02-Iink.test.ts delete mode 100644 test/unit/_dataset/configuration.dataset.ts delete mode 100644 test/unit/jest.setup.js delete mode 100644 test/unit/utils/PointerEventFake.ts delete mode 100644 test/unit/utils/helpers.ts delete mode 100644 tsconfig.json delete mode 100644 typedoc.json delete mode 100644 yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 0cb901f8..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - node: true, - es6: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - project: "./tsconfig.json" - }, - plugins: [ - "@typescript-eslint" - ], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - ], - rules: { - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-var-requires": "error", - "quotes": "off", - "@typescript-eslint/quotes": [ - "error", - "double", - { - "avoidEscape": true, - "allowTemplateLiterals": true - } - ], - "max-statements-per-line": [ - "error", - { - "max": 1 - } - ] - }, -} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4621c33e..00000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -coverage -.vscode/* -!.vscode/launch.json - -docker/examples/delivery -test/integration/screenshots -docs -dist diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index b1836bb0..00000000 --- a/.prettierrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "trailingComma":"none", - "tabWidth": 2, - "semi": true, - "singleQuote": false, - "printWidth": 150 -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index c683588f..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:8000/examples/index.html", - "webRoot": "${workspaceFolder}", - "preLaunchTask": "tsc: build - tsconfig.json", - "outFiles": ["${workspaceFolder}/dist/**/*.js"] - } - ] -} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index dd66d395..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,4 +0,0 @@ -# [v1.0.0](https://github.com/MyScript/iinkJS/tree/v1.0.0) - -## Features -- migration javascript to typescript [link](https://github.com/MyScript/iinkJS) \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 18453c66..00000000 --- a/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -Copyright MyScript. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index 51a7fa5a..00000000 --- a/README.md +++ /dev/null @@ -1,176 +0,0 @@ -# iinkTS - -[![npm version](https://badge.fury.io/js/iink-ts.svg)](https://badge.fury.io/js/iink-ts) -[![Examples](https://img.shields.io/badge/Link%20to-examples-blue.svg)](https://myscript.github.io/iinkTS/examples/) -[![Documentation](https://img.shields.io/badge/Link%20to-documentation-green.svg)](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/) - -> The fastest way to integrate rich **handwriting** features in your webapp. - -
- -
- -iinkTS is a JavaScript library that can be used in every web application to bring handwriting recognition. - -It integrates all you need: - -* Signal capture for all devices, -* Digital ink rendering, -* Link to MyScript Cloud to bring handwriting recognition. - -## Table of contents - -* [Features](https://github.com/MyScript/iinkTS#features) -* [Requirements](https://github.com/MyScript/iinkTS#requirements) -* [Installation](https://github.com/MyScript/iinkTS#installation) -* [Usage](https://github.com/MyScript/iinkTS#usage) -* [Documentation](https://github.com/MyScript/iinkTS#documentation) -* [Development](https://github.com/MyScript/iinkTS#development) -* [Support](https://github.com/MyScript/iinkTS#getting-support ) -* [Feedback](https://github.com/MyScript/iinkTS#sharing-your-feedback) -* [Contributing](https://github.com/MyScript/iinkTS#contributing) - -## Features - -* Text and Math support, -* Easy to integrate, -* Digital ink capture and rendering, -* Rich editing gestures, -* Import and export content, -* Styling, -* Typeset support, -* More than 200 mathematical symbols supported, -* 65 supported languages. - -You can discover all the features on our Developer website for [Text](https://developer.myscript.com/features/text) and [Math](https://developer.myscript.com/features/math). - -## Requirements - -1. Have [npm](https://www.npmjs.com/get-npm), [yarn](https://yarnpkg.com/en/docs/install). -2. Have a MyScript developer account. You can create one [here](https://developer.myscript.com/support/account/registering-myscript-cloud/). -3. Get your keys and the free monthly quota to access MyScript Cloud at [developer.myscript.com](https://developer.myscript.com/getting-started/web) - -## Installation - -iinkTS can be installed with the well known package managers `npm`, `yarn`. - -If you want to use `npm` or `yarn` you first have to init a project (or use an existing one). - -```shell -npm init -OR -yarn init -``` - -You can then install iinkTS and use it as showed in the [Usage](https://github.com/MyScript/iinkTS#usage) section. - -```shell -npm install iink-ts -OR -yarn add iink-ts -``` - -## Usage - -1. Create an `index.html` file in the same directory. - -2. Add the following lines in the `head` section of your file to use iinkTS and the css : -```html - -``` - -3. Still in the `head` section, add a `style` and specify the height and the width of your editor: -```html - -``` - -4. In the `body` tag, create a `div` tag that will contain the editing area: -```html -
-``` - -5. In JavaScript and within a ` - - - -
- - - -``` - -7. Open `index.html` in your browser or serve your folder content using any web server. - -You can find this guide, and a more complete example on the [MyScript Developer website](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/). - -## Documentation - -You can find a complete documentation with the following sections on our Developer website: - -* **Get Started**: [how to use iinkTS with a full example](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/get-started/), -* **Editing**: [how to interact with content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/editing/), -* **Conversion**: [how to convert your handwritten content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/conversion/), -* **Import and Export**: [how to import and export your content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/import-and-export/), -* **Styling**: [how to style content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/styling/). - -As well as a global [Configuration page](https://developer.myscript.com/docs/interactive-ink/latest/reference/web/configuration/). - -We also provide a complete [API Reference](https://myscript.github.io/iinkTS/docs/). - -## Development - -Instructions to help you build the project and develop are available in the [SETUP.md](https://github.com/MyScript/iinkTS/blob/master/SETUP.md) file. - - -## Getting support - -You can get support and ask your questions on the [dedicated section](https://developer-support.myscript.com/support/discussions/forums/16000096760) of MyScript Developer website. - -## Sharing your feedback ? - -Made a cool app with iinkTS? We would love to hear about you! -We’re planning to showcase apps using it so let us know by sending a quick mail to [myapp@myscript.com](mailto://myapp@myscript.com). - -## Contributing - -We welcome your contributions: if you would like to extend iinkTS for your needs, feel free to fork it! - -Please take a look at our [contributing](https://github.com/MyScript/iinkTS/blob/master/CONTRIBUTING.md) guidelines before submitting your pull request. - -## License -This library is licensed under the [Apache 2.0](http://opensource.org/licenses/Apache-2.0). diff --git a/commit.txt b/commit.txt new file mode 100644 index 00000000..8859268a --- /dev/null +++ b/commit.txt @@ -0,0 +1 @@ +c8c79930819353cbc05197835197cdac80ba112a diff --git a/config/rollup.config.build.js b/config/rollup.config.build.js deleted file mode 100644 index cf8179e8..00000000 --- a/config/rollup.config.build.js +++ /dev/null @@ -1,3 +0,0 @@ -import config from "./rollup.config" - -export default config diff --git a/config/rollup.config.dev.js b/config/rollup.config.dev.js deleted file mode 100644 index b75e24fa..00000000 --- a/config/rollup.config.dev.js +++ /dev/null @@ -1,29 +0,0 @@ -import serve from "rollup-plugin-serve" -import livereload from "rollup-plugin-livereload" -import config from "./rollup.config" - -config[0].plugins.push( - serve({ - open: true, - openPage: "/examples/index.html", - verbose: true, - contentBase: "", - host: "localhost", - port: 8000, - headers: { - "Access-Control-Allow-Origin": "*" - } - }), - livereload({ - watch: [ - "dist", - "examples" - ] - }) -) - -config.watch = { - include: "src/**" -} - -export default config diff --git a/config/rollup.config.js b/config/rollup.config.js deleted file mode 100644 index ad4db9ea..00000000 --- a/config/rollup.config.js +++ /dev/null @@ -1,49 +0,0 @@ -import typescript from "rollup-plugin-typescript2" -import { terser } from "rollup-plugin-terser" -import resolve from "@rollup/plugin-node-resolve" -import postcss from "rollup-plugin-postcss" -import dts from "rollup-plugin-dts" -import commonjs from "rollup-plugin-commonjs" - -export default [ - { - input: "src/iink.ts", - output: [ - { - name: "iink", - file: "dist/iink.min.js", - format: "umd", - exports: "named", - }, - { - file: "./dist/iink.esm.js", - format: "esm", - }, - ], - plugins: [ - commonjs({ - include: ["node_modules/json-css/**", "node_modules/crypto-js/**"], - }), - resolve(), - typescript(), - terser({ - keep_fnames: true, - compress: true, - }), - postcss(), - ], - }, - { - input: "src/iink.ts", - plugins: [ - dts(), - postcss({ - inject: false - }), - ], - output: { - file: `dist/iink.d.ts`, - format: "es", - } - } -] diff --git a/dist/iink.d.ts b/dist/iink.d.ts new file mode 100644 index 00000000..ffe8b4fa --- /dev/null +++ b/dist/iink.d.ts @@ -0,0 +1,1253 @@ +type TEventConfiguration = { + processDelay: number +} + +type TListenerConfiguration = { + capture: boolean + passive: boolean +} + +type TGrabberConfiguration = { + listenerOptions: TListenerConfiguration + xyFloatPrecision: number + timestampFloatPrecision: number +} + +type TConvertConfiguration = { + convertOnDoubleTap: boolean +} + +type TEraserConfiguration = { + "erase-precisely": boolean +} + +type TMarginConfiguration = { + bottom: number + left: number + right: number + top: number +} + +type TTextGuidesConfiguration = { + enable: boolean +} + +type TTextConfConfiguration = { + customResources?: string[] + customLexicon?: string[] + addLKText?: boolean +} + +type TTextConfiguration = { + text?: boolean + mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[] + margin: TMarginConfiguration + guides?: TTextGuidesConfiguration + configuration?: TTextConfConfiguration + eraser?: TEraserConfiguration +} + +type TDiagramConvertConfiguration = { + edge?: boolean + node?: boolean + text?: boolean + "match-text-size"?: boolean +} + +type TDiagramConfiguration = { + mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[] + "enable-sub-blocks"?: boolean + text?: TTextConfConfiguration + convert?: TDiagramConvertConfiguration + "session-time"?: number + eraser?: TEraserConfiguration +} + +type TImageViewportConfiguration = { + x: number + y: number + width: number + height: number +} + +type TImageConfiguration = { + guides: boolean + viewport: TImageViewportConfiguration +} + +type TJiixConfiguration = { + "bounding-box"?: boolean + strokes: boolean + text?: { + chars: boolean + words: boolean + } + style?: boolean +} + +type TMathMLFlavor = { + name: string +} + +type TMathMLExport = { + flavor: TMathMLFlavor +} + +type TExportConfiguration$1 = { + "image-resolution"?: number + image?: TImageConfiguration + jiix?: TJiixConfiguration + mathml?: TMathMLExport +} + +type TRoundingMode = "half up" | "truncate" + +type TAngleUnit = "deg" | "rad" + +type TSolverOptions = "algebraic" | "numeric" + +type TSolverConfiguration = { + enable?: boolean + "fractional-part-digits"?: number + "decimal-separator"?: string + "rounding-mode"?: TRoundingMode + "angle-unit"?: TAngleUnit + options?: TSolverOptions +} + +type TUndoRedoMode = "stroke" | "session" + +type TMathUndoRedoConfiguration = { + mode: TUndoRedoMode +} + +type TMathConfiguration = { + mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[] + solver?: TSolverConfiguration + margin: TMarginConfiguration + "undo-redo"?: TMathUndoRedoConfiguration + customGrammar?: string + customGrammarId?: string + customGrammarContent?: string + eraser?: TEraserConfiguration + "session-time"?: number + "recognition-timeout"?: number +} + +type TRawContentConfiguration = { + text?: TTextConfConfiguration + "session-time"?: number + recognition?: TRecognitionConfiguration + eraser?: TEraserConfiguration +} + +type TDebugConfiguration = { + "draw-text-boxes": boolean + "draw-image-boxes": boolean +} + +type TRecognitionRendererConfiguration = { + debug: TDebugConfiguration +} + +type TRecognitionType = "TEXT" | "MATH" | "DIAGRAM" | "Raw Content" + +type TConverstionState = "DIGITAL_EDIT" | "HANDWRITING" + +type TRecognitionConfiguration$1 = { + convert?: TConvertConfiguration + type: TRecognitionType + alwaysConnected: boolean + lang: string + math: TMathConfiguration + text: TTextConfiguration + diagram: TDiagramConfiguration + renderer: TRecognitionRendererConfiguration + export: TExportConfiguration$1 + "raw-content": TRawContentConfiguration + gesture: TGesture +} + +type TRecognitionConfigurationClient = { + convert?: TConvertConfiguration + type?: TRecognitionType + alwaysConnected?: boolean + lang?: string + math?: TMathConfiguration + text?: TTextConfiguration + diagram?: TDiagramConfiguration + renderer?: TRecognitionRendererConfiguration + export?: TExportConfiguration$1 + "raw-content"?: TRawContentConfiguration + gesture?: { enable: boolean } +} + +type TGuidesConfiguration = { + enable: boolean + gap: numnber +} + +type TSmartGuidesConfiguration = { + enable: boolean + fadeOut: { + enable: boolean + duration: number + } +} + +type TRenderingConfiguration = { + minHeight: number + minWidth: number + smartGuide: TSmartGuidesConfiguration + guides: TGuidesConfiguration +} + +type TProtocol = "WEBSOCKET" | "REST" + +type TSchene = "https" | "http" + +type TServerConfiguration = { + protocol: TProtocol, + scheme: TSchene, + host: string + applicationKey: string + hmacKey: string + version: string + useWindowLocation?: boolean + websocket: { + pingEnabled: boolean + pingDelay: number + maxPingLostCount: number + autoReconnect: boolean + maxRetryCount: number + fileChunkSize: number + } +} + +type TServerConfigurationClient = { + protocol?: TProtocol, + scheme?: TSchene, + host?: string + applicationKey?: string + hmacKey?: string + version?: string + useWindowLocation?: boolean + websocket?: { + pingEnabled?: boolean + pingDelay?: number + maxPingLostCount?: number + autoReconnect?: boolean + maxRetryCount?: number + fileChunkSize?: number + } +} + +/** + * Configure when the action is triggered. + * POINTER_UP : Action is triggered on every PenUP. + * This is the recommended mode for CDK V3 WebSocket recognitions. + * QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. + * The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. + * This is the recommended mode for all REST discoveries. + * DEMAND : Action is triggered on external demande + */ + type TTriggerConfiguration = { + exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND" + exportContentDelay: number + resizeTriggerDelay: number +} + +type TUndoRedoConfiguration = { + maxStackSize: number +} + +type TConfiguration = { + server: TServerConfiguration + recognition: TRecognitionConfiguration$1 + grabber: TGrabberConfiguration + rendering: TRenderingConfiguration + triggers: TTriggerConfiguration + events: TEventConfiguration + "undo-redo": TUndoRedoConfiguration +} + +type TConfigurationClient = { + server?: TServerConfigurationClient + recognition?: TRecognitionConfigurationClient + grabber?: TGrabberConfiguration + rendering?: TRenderingConfiguration + triggers?: TTriggerConfiguration + events?: TEventConfiguration + "undo-redo"?: TUndoRedoConfiguration +} + +type TPoint = { + x: number; + y: number; +}; +type TPointer = TPoint & { + t: number; + p: number; +}; + +interface IGrabber { + attach(domElement?: HTMLElement): void + + detach(domElement?: HTMLElement): void + + onPointerDown(evt: PointerEvent, point: TPointer): void + + onPointerMove(evt: PointerEvent, point: TPointer): void + + onPointerUp(evt: PointerEvent, point: TPointer): void +} + +/** + * @typedef {Object} PenStyle + * @property {String} color=#000000 Color (supported formats rgb() rgba() hsl() hsla() #rgb #rgba #rrggbb #rrggbbaa) + * @property {String} -myscript-pen-width=1 Width of strokes and primitives in mm (no other unit is supported yet) + * @property {String} -myscript-pen-fill-style=none + * @property {String} -myscript-pen-fill-color=#FFFFFF00 Color filled inside the area delimited by strokes and primitives + */ +type TPenStyle = { + color?: string + width?: number + "-myscript-pen-width"?: number + "-myscript-pen-fill-style"?: string + "-myscript-pen-fill-color"?: string +} + +type TSymbol = { + elementType?: string + type: string + style: TPenStyle +} + +type TStrokeJSON = { + id: string + pointerType: string + x: number[] + y: number[] + t: number[] + p: number[] +} + +type TStroke = TSymbol & { + id: string + pointerId: number + pointerType: string + pointers: TPointer[] + length: number +} + +type TRecognitionPositions = { + lastSentPosition: number + lastReceivedPosition: number +} + +type TWordExport = { + id?: string + label: string, + candidates?: string[] +} + +type TJIIXExport = { + type: string, + id: string, + label: string, + version: string, + words: TWordExport[] +} + +/** + * List all supported MIME types for export. + * Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} + */ +type TExport = { + /** @hidden */ + [key: string]: TJIIXExport | string | Blob + /** + * vnd.myscript.jiix is used for text and raw-content exports + */ + "application/vnd.myscript.jiix"?: TJIIXExport + /** + * text/plain is only use for text export + */ + "text/plain"? : string + /** + * x-latex is only use for math export + * @see {@link https://katex.org/docs/browser.html | katex} to render + */ + "application/x-latex"?: string + /** + * mathml+xml is only use for math export + * @see {@link https://www.w3.org/Math/whatIsMathML.html | Mathematical Markup Language} + */ + "application/mathml+xml"?: string + /** + * svg+xml is only use for diagram export + */ + "image/svg+xml"?: string + /** + * vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob | Blob} + */ + "application/vnd.openxmlformats-officedocument.presentationml.presentation"?: Blob +} + +interface IModel +{ + readonly creationTime: number + modificationDate: number + currentStroke?: TStroke + positions: TRecognitionPositions + rawStrokes: TStroke[] + selectedStrokes: TStroke[] + converts?: TExport + exports?: TExport + width: number + height: number + idle: boolean + + mergeExport(exports: TExport) + mergeConvert(converts: TExport) + + addPoint(stroke: TStroke, point: TPointer): void + addStroke(stroke: TStroke): void + extractUnsentStrokes(): TStroke[] + + initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi: number = 96): void + appendToCurrentStroke(point: TPointer): void + endCurrentStroke(point: TPointer): void + + resetSelectedStrokes(): void + appendSelectedStrokesFromPoint(point: TPoint): void + + removeStroke(id: string): void + updateStroke(updatedStroke: TStroke): void + removeStrokesFromPoint(point: TPoint): string[] + + updatePositionSent(position: number = this.model.rawStrokes.length - 1): void + updatePositionReceived(): void + + getClone(): IModel + + clear(): void +} + +type TMathTheme = { + "font-family": string +} + +type TMathSolvedTheme = { + "font-family": string + color: string +} + +type TTextTheme = { + "font-family": string, + "font-size": number +} + +type TTheme = { + ink: TPenStyle + ".math": TMathTheme + ".math-solved": TMathSolvedTheme + ".text": TTextTheme + [key: string]: unknown +} + +interface IRecognizer { + export(model: IModel, mimeTypes?: string[]): Promise + resize(model: IModel): Promise + import?(model: IModel, data: Blob, mimeType?: string): Promise +} + +type TUndoRedoContext = { + canUndo: boolean + canRedo: boolean + empty: boolean + stackIndex: number + possibleUndoCount: number + stack: IModel[] +} + +declare class StyleManager { + #private; + constructor(penStyle?: TPenStyle, theme?: TTheme); + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(p?: TPenStyle): void; + get theme(): TTheme; + setTheme(t?: TTheme): void; + get penStyleClasses(): string; + setPenStyleClasses(psc?: string): void; +} + +type TBehaviorOptions = { + configuration: TConfiguration + behaviors?: { + grabber?: IGrabber + recognizer?: IRecognizer + } + penStyle?: TPenStyle + theme?: TTheme +} + +interface IBehaviors +{ + name: string + grabber: IGrabber + recognizer: IRecognizer + context: TUndoRedoContext + options: TBehaviorOptions + styleManager: StyleManager + mode: ModeInteraction + #configuration: TConfiguration + + get currentPenStyle(): TPenStyle + + get model(): IModel + + get penStyle(): TPenStyle + setPenStyle(penStyle?: TPenStyle) + + get penStyleClasses(): string + setPenStyleClasses(penStyleClasses?: string) + + get theme(): TTheme + setTheme(theme?: TTheme) + + get configuration(): TConfiguration + set configuration(conf: TConfiguration) + + async init: (element: HTMLElement) => Promise + async export(mimeTypes?: string[]): Promise + async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise + async resize(height: number, width: number): Promise + async undo(): Promise + async redo(): Promise + + async waitForIdle?(): Promise + async importPointEvents?(strokes: TStroke[]): Promise + async import?(data: Blob, mimeType?: string): Promise + + async clear(): Promise + + async destroy(): Promise +} + +/** + * @group Editor + * @remarks List the possibilities of interactions + */ +declare const enum ModeInteraction$1 { + Writing = "writing", + Erasing = "erasing" +} +/** + * @group Constants + */ +declare const _default$1: { + readonly Error: { + readonly NO_ACTIVITY: "Session closed due to no activity."; + readonly WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey."; + readonly TOO_OLD: "Session is too old. Max Session Duration Reached."; + readonly UNKNOW: "An unknown error has occurred."; + readonly ABNORMAL_CLOSURE: "MyScript recognition server is not reachable."; + readonly CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity."; + readonly GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection."; + readonly PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error."; + readonly UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)"; + readonly INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message)."; + readonly POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy."; + readonly MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large."; + readonly INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request."; + readonly SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting."; + readonly TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients."; + readonly BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server."; + readonly TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake"; + }; + readonly EventType: { + /** + * @event + * event emitted when history has changed i.e. the context of undo-redo + */ + readonly CHANGED: "changed"; + /** + * @event + * event emitted when clearing is complete + */ + readonly CLEARED: "cleared"; + /** + * @event + * event emitted after the conversion is complete + */ + readonly CONVERTED: "converted"; + /** + * @event + * event emitted when the editor encounters an error + */ + readonly ERROR: "error"; + /** + * @event + * event emitted on click on pointer events + */ + readonly POINTEREVENTS: "pointer_events"; + /** + * @event + * event emitted after the end of the export + */ + readonly EXPORTED: "exported"; + /** + * @event + * event emitted after the end of the import + */ + readonly IMPORTED: "imported"; + /** + * @event + * event emitted when the server is idle after a job + */ + readonly IDLE: "idle"; + /** + * @event + * event emitted after full editor initialization + */ + readonly LOADED: "loaded"; + }; + readonly InternalEventType: { + readonly SVG_PATCH: "internal_svg_patch"; + readonly EXPORTED: "internal_exported"; + readonly CLEAR_MESSAGE: "internal_clear_message"; + readonly ERROR: "internal_error"; + readonly NOTIF: "internal_notif"; + readonly IMPORT_JIIX: "internal_import_jiix"; + readonly CONVERT: "internal_convert"; + readonly CLEAR: "internal_clear"; + readonly CONTEXT_CHANGE: "internal_context_change"; + readonly IDLE: "internal_idle"; + readonly WS_CLOSED: "internal_websocket_closed"; + }; + readonly Exports: { + readonly JIIX: "application/vnd.myscript.jiix"; + readonly TEXT: "text/plain"; + readonly LATEX: "application/x-latex"; + readonly MATHML: "application/mathml+xml"; + readonly SVG: "image/svg+xml"; + readonly OFFICE_DOCUMENT: "application/vnd.openxmlformats-officedocument.presentationml.presentation"; + }; + readonly WSMessage: { + CLOSE_RECOGNIZER: string; + }; +}; + +declare class PublicEvent extends EventTarget { + #private; + private constructor(); + static getInstance(): PublicEvent; + setElement(el: HTMLElement): void; + emitLoaded(): void; + emitExported(exports: TExport): void; + emitChanged(undoRedoContext: TUndoRedoContext): void; + emitIdle(idle: boolean): void; + emitCleared(model?: IModel): void; + emitConverted(exports: TExport): void; + emitImported(exports: TExport): void; +} + +type HTMLEditorElement = HTMLElement & { + editor: Editor; +}; +declare class Editor { + #private; + wrapperHTML: HTMLEditorElement; + debug: boolean; + constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss?: string); + get initializationPromise(): Promise; + get model(): IModel; + get behaviors(): IBehaviors; + get configuration(): TConfiguration; + set configuration(configuration: TConfiguration); + get mode(): ModeInteraction$1; + set mode(m: ModeInteraction$1); + get events(): PublicEvent; + get context(): TUndoRedoContext; + get grabber(): IGrabber; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + set penStyle(ps: TPenStyle); + get theme(): TTheme; + set theme(t: TTheme); + get penStyleClasses(): string; + set penStyleClasses(psc: string); + initialize(): Promise; + waitForIdle(): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + resize(): Promise; + export(mimeTypes?: string[]): Promise; + convert(params?: { + conversionState?: TConverstionState; + mimeTypes?: string[]; + }): Promise; + import(data: Blob | string | TJIIXExport, mimeType?: string): Promise; + importPointEvents(strokes: TStroke[]): Promise; +} + +declare class DeferredPromise { + promise: Promise; + resolve: (value: T) => void; + reject: (value: Error) => void; + isFullFilled: boolean; + isPending: boolean; + constructor(); +} + +declare function computeDistance(p1: TPoint, p2: TPoint): number; + +declare const geometric_computeDistance: typeof computeDistance; +declare namespace geometric { + export { + geometric_computeDistance as computeDistance, + }; +} + +declare const isVersionSuperiorOrEqual: (source: string, target: string) => boolean; + +declare const version_isVersionSuperiorOrEqual: typeof isVersionSuperiorOrEqual; +declare namespace version { + export { + version_isVersionSuperiorOrEqual as isVersionSuperiorOrEqual, + }; +} + +declare function getAvailableFontList(configuration: TConfigurationClient): Promise>; + +declare function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>; + +declare class Configuration implements TConfiguration { + events: TEventConfiguration; + grabber: TGrabberConfiguration; + recognition: TRecognitionConfiguration$1; + rendering: TRenderingConfiguration; + server: TServerConfiguration; + triggers: TTriggerConfiguration; + "undo-redo": TUndoRedoConfiguration; + constructor(configuration?: TConfigurationClient); + overrideDefaultConfiguration(configuration?: TConfigurationClient): void; +} + +declare const DefaultServerConfiguration: TServerConfiguration; +declare const DefaultRecognitionConfiguration: TRecognitionConfiguration$1; +declare const DefaultGrabberConfiguration: TGrabberConfiguration; +declare const DefaultRenderingConfiguration: TRenderingConfiguration; +declare const DefaultTriggerConfiguration: TTriggerConfiguration; +declare const DefaultEventsConfiguration: TEventConfiguration; +declare const DefaultUndoRedoConfiguration: TUndoRedoConfiguration; +declare const DefaultConfiguration: TConfiguration; + +declare class PointerEventGrabber implements IGrabber { + private configuration; + private domElement; + private activePointerId?; + private prevent; + onPointerDown: (evt: PointerEvent, point: TPointer) => void; + onPointerMove: (evt: PointerEvent, point: TPointer) => void; + onPointerUp: (evt: PointerEvent, point: TPointer) => void; + constructor(configuration: TGrabberConfiguration); + private roundFloat; + private extractPoint; + private pointerDownHandler; + private pointerMoveHandler; + private pointerUpHandler; + attach(domElement: HTMLElement): void; + detach(): void; +} + +declare class CanvasStroker { + private renderArc; + private renderLine; + private renderFinal; + private renderQuadratic; + drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void; +} + +declare class CanvasRenderer { + config: TRenderingConfiguration; + stroker: CanvasStroker; + context: { + parent: HTMLElement; + renderingCanvas: HTMLCanvasElement; + renderingCanvasContext: CanvasRenderingContext2D; + capturingCanvas: HTMLCanvasElement; + capturingCanvasContext: CanvasRenderingContext2D; + }; + constructor(config: TRenderingConfiguration); + private createCanvas; + private resizeContent; + private drawSymbol; + init(element: HTMLElement): void; + drawModel(model: IModel): void; + drawPendingStroke(stroke: TStroke | undefined): void; + resize(model: IModel): void; + destroy(): void; +} + +type TRestPostConfiguration = { + lang: string, + diagram?: TDiagramConfiguration, + math?: TMathConfiguration, + "raw-content"?: TRawContentConfiguration, + text?: TTextConfiguration, + export: TExportConfiguration +} + +declare class RestRecognizer implements IRecognizer { + protected serverConfiguration: TServerConfiguration; + protected recognitionConfiguration: TRecognitionConfiguration$1; + constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration$1); + get url(): string; + get postConfig(): TRestPostConfiguration; + private buildData; + private post; + private tryFetch; + private getMimeTypes; + convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise; + export(model: IModel, requestedMimeTypes?: string[]): Promise; + resize(model: IModel): Promise; +} + +type TWebSocketEvent = { + type: string + [key: string]: unknown +} + +type TUpdatePatchType = "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE" + +type TUpdatePatch = { + type: TUpdatePatchType +} + +type TWebSocketSVGPatchEvent = TWebSocketEvent & { + updates: TUpdatePatch[] + layer: ("MODEL" | "CAPTURE") +} + +declare class InternalEvent extends EventTarget { + #private; + private constructor(); + static getInstance(): InternalEvent; + removeAllListeners(): void; + emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void; + addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void; + emitExported(exports: TExport): void; + addExportedListener(callback: (exports: TExport) => void): void; + emitClearMessage(): void; + addClearMessageListener(callback: () => void): void; + emitError(err: Error): void; + addErrorListener(callback: (err: Error) => void): void; + emitWSClosed(): void; + addWSClosedListener(callback: () => void): void; + emitNotif(notif: { + message: string; + timeout?: number; + }): void; + addNotifListener(callback: (notif: { + message: string; + timeout?: number; + }) => void): void; + emitImportJIIX(jiix: TJIIXExport): void; + addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void; + emitConvert(conversionState?: TConverstionState): void; + addConvertListener(callback: (params?: { + conversionState?: TConverstionState; + mimeTypes?: string[]; + }) => void): void; + emitClear(): void; + addClearListener(callback: () => void): void; + emitContextChange(context: TUndoRedoContext): void; + addContextChangeListener(callback: (context: TUndoRedoContext) => void): void; + emitIdle(idle: boolean): void; + addIdleListener(callback: (idle: boolean) => void): void; +} + +declare class UndoRedoContext implements TUndoRedoContext { + canUndo: boolean; + canRedo: boolean; + empty: boolean; + stackIndex: number; + possibleUndoCount: number; + stack: IModel[]; + constructor(model: IModel); +} + +declare class UndoRedoManager { + context: UndoRedoContext; + configuration: TUndoRedoConfiguration; + constructor(configuration: TUndoRedoConfiguration, model: IModel); + get internalEvent(): InternalEvent; + private updateCanUndoRedo; + addModelToStack(model: IModel): void; + removeLastModelInStack(): void; + updateModelInStack(model: IModel): void; + undo(): IModel; + redo(): IModel; + reset(model: IModel): void; +} + +declare class RestBehaviors implements IBehaviors { + #private; + name: string; + options: TBehaviorOptions; + grabber: PointerEventGrabber; + renderer: CanvasRenderer; + recognizer: RestRecognizer; + undoRedoManager: UndoRedoManager; + styleManager: StyleManager; + mode: ModeInteraction$1; + constructor(options: TBehaviorOptions); + get internalEvent(): InternalEvent; + get model(): IModel; + get context(): TUndoRedoContext; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(ps?: TPenStyle): void; + get penStyleClasses(): string; + setPenStyleClasses(psc?: string): void; + get theme(): TTheme; + setTheme(t?: TTheme): void; + get configuration(): TConfiguration; + init(domElement: HTMLElement): Promise; + private onPointerDown; + private onPointerMove; + private onPointerUp; + drawCurrentStroke(): void; + updateModelRendering(): Promise; + export(mimeTypes?: string[]): Promise; + convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise; + resize(height: number, width: number): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + destroy(): Promise; +} + +/** + * A websocket dialog have this sequence : + * --------------------------- Client --------------------------------------------------- Server ---------------------------------- + * init: send newContentPackage or restoreIInkSession ==================> + * <================== hmacChallenge + * answer hmacChallenge: send the hmac ==================> + * <================== contentPackageDescription + * answer contentPackageDescription: + * send the configuration ==================> + * send newContentPart or openContentPart ==================> + * <================== partChanged + * <================== contentChanged + * <================== newPart + * <================== svgPatch + * + * setPenStyle (send the parameters) ==================> + * setTheme (send the parameters) ==================> + * setPenStyleClasses (send the parameters) ==================> + * <================== svgPatch + * addStrokes (send the strokes ) ============> + * <================== update + */ +declare class WSRecognizer implements IRecognizer { + protected serverConfiguration: TServerConfiguration; + protected recognitionConfiguration: TRecognitionConfiguration$1; + protected socket: WebSocket; + protected pingCount: number; + protected reconnectionCount: number; + protected viewSizeHeight: number; + protected viewSizeWidth: number; + protected sessionId?: string; + protected currentPartId?: string; + protected currentErrorCode?: string | number; + protected penStyle?: TPenStyle; + protected penStyleClasses?: string; + protected theme?: TTheme; + protected connected?: DeferredPromise; + protected initialized?: DeferredPromise; + protected addStrokeDeferred?: DeferredPromise; + protected exportDeferred?: DeferredPromise; + protected convertDeferred?: DeferredPromise; + protected importDeferred?: DeferredPromise; + protected resizeDeferred?: DeferredPromise; + protected undoDeferred?: DeferredPromise; + protected redoDeferred?: DeferredPromise; + protected clearDeferred?: DeferredPromise; + protected importPointEventsDeferred?: DeferredPromise; + protected waitForIdleDeferred?: DeferredPromise; + url: string; + constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration$1); + get mimeTypes(): string[]; + get internalEvent(): InternalEvent; + protected infinitePing(): void; + protected openCallback(): void; + protected rejectDeferredPending(error: Error): void; + protected closeCallback(evt: CloseEvent): void; + protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void; + protected manageContentPackageDescriptionMessage(): void; + protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void; + protected manageExportMessage(websocketMessage: TWebSocketEvent): void; + protected manageWaitForIdle(): Promise; + protected manageErrorMessage(websocketMessage: TWebSocketEvent): void; + protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void; + protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void; + protected messageCallback(message: MessageEvent): void; + init(height: number, width: number): Promise; + send(message: TWebSocketEvent): Promise; + addStrokes(model: IModel): Promise; + setPenStyle(penStyle: TPenStyle): Promise; + setPenStyleClasses(penStyleClasses: string): Promise; + setTheme(theme: TTheme): Promise; + export(model: IModel, requestedMimeTypes?: string[]): Promise; + import(model: IModel, data: Blob, mimeType?: string): Promise; + resize(model: IModel): Promise; + importPointEvents(strokes: TStroke[]): Promise; + convert(model: IModel, conversionState?: TConverstionState): Promise; + waitForIdle(): Promise; + undo(model: IModel): Promise; + redo(model: IModel): Promise; + clear(model: IModel): Promise; + close(code: number, reason: string): void; + destroy(): void; +} + +declare class SVGStroker { + private getArcPath; + private getLinePath; + private getFinalPath; + private getQuadraticPath; + private buildSVGPath; + drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { + name: string; + value: string; + }[]): void; +} + +declare class WSSVGRenderer { + #private; + config: TRenderingConfiguration; + stroker: SVGStroker; + context: { + parent: HTMLElement; + }; + constructor(config: TRenderingConfiguration); + init(element: HTMLElement): void; + updateLayer(layerName: string, update: TUpdatePatch): void; + updatesLayer(layerName: string, updates: TUpdatePatch[]): void; + clearPendingStroke(): void; + drawPendingStroke(stroke: TStroke): void; + resize(model: IModel): void; + destroy(): void; +} + +declare class WSBehaviors implements IBehaviors { + #private; + name: string; + options: TBehaviorOptions; + grabber: PointerEventGrabber; + renderer: WSSVGRenderer; + recognizer: WSRecognizer; + context: TUndoRedoContext; + styleManager: StyleManager; + mode: ModeInteraction$1; + constructor(options: TBehaviorOptions); + get internalEvent(): InternalEvent; + get model(): IModel; + get configuration(): TConfiguration; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(ps?: TPenStyle): Promise; + get penStyleClasses(): string; + setPenStyleClasses(psc?: string): Promise; + get theme(): TTheme; + setTheme(t: TTheme): Promise; + init(domElement: HTMLElement): Promise; + private onPointerDown; + private onPointerMove; + private onPointerUp; + private onSVGPatch; + private onContextChange; + drawCurrentStroke(): void; + updateModelRendering(): Promise; + waitForIdle?(): Promise; + importPointEvents(strokes: TStroke[]): Promise; + export(mimeTypes?: string[]): Promise; + convert(conversionState?: TConverstionState): Promise; + import(data: Blob, mimeType?: string): Promise; + resize(height: number, width: number): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + destroy(): Promise; +} + +declare function computeHmac(message: string, applicationKey: string, hmacKey: string): string; + +declare const ShapeSymbols: { + table: string; + shape: string; + recognizedShape: string; + ellipse: string; + line: string; +}; +/** + * Draw a line + * @param {Object} context2D Current rendering context2D + * @param {{x: Number, y: Number}} p1 Origin point + * @param {{x: Number, y: Number}} p2 Destination point + */ +declare function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint): void; +/** + * Draw a shape symbol + * @param {Object} context2D Current rendering context2D + * @param {Object} symbol Symbol to draw + */ +declare function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol): void; + +declare const CanvasRendererShapeSymbol_ShapeSymbols: typeof ShapeSymbols; +declare const CanvasRendererShapeSymbol_drawLine: typeof drawLine; +declare const CanvasRendererShapeSymbol_drawShapeSymbol: typeof drawShapeSymbol; +declare namespace CanvasRendererShapeSymbol { + export { + CanvasRendererShapeSymbol_ShapeSymbols as ShapeSymbols, + CanvasRendererShapeSymbol_drawLine as drawLine, + CanvasRendererShapeSymbol_drawShapeSymbol as drawShapeSymbol, + }; +} + +declare function drawStroke(context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker): void; + +declare const CanvasRendererStrokeSymbol_drawStroke: typeof drawStroke; +declare namespace CanvasRendererStrokeSymbol { + export { + CanvasRendererStrokeSymbol_drawStroke as drawStroke, + }; +} + +declare const TextSymbols: { + inputCharacter: string; + char: string; + string: string; + textLine: string; +}; +/** + * Draw a text symbol + * @param {Object} context Current rendering context + * @param {Object} symbol Symbol to draw + */ +declare function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol): void; + +declare const CanvasRendererTextSymbol_TextSymbols: typeof TextSymbols; +declare const CanvasRendererTextSymbol_drawTextSymbol: typeof drawTextSymbol; +declare namespace CanvasRendererTextSymbol { + export { + CanvasRendererTextSymbol_TextSymbols as TextSymbols, + CanvasRendererTextSymbol_drawTextSymbol as drawTextSymbol, + }; +} + +declare function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]; +declare function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer; +declare function computeAxeAngle(begin: TPointer, end: TPointer): number; + +declare const QuadraticUtils_computeLinksPoints: typeof computeLinksPoints; +declare const QuadraticUtils_computeMiddlePoint: typeof computeMiddlePoint; +declare const QuadraticUtils_computeAxeAngle: typeof computeAxeAngle; +declare namespace QuadraticUtils { + export { + QuadraticUtils_computeLinksPoints as computeLinksPoints, + QuadraticUtils_computeMiddlePoint as computeMiddlePoint, + QuadraticUtils_computeAxeAngle as computeAxeAngle, + }; +} + +declare const DefaultPenStyle: TPenStyle; + +declare const DefaultTheme: TTheme; + +declare const _default: { + themeToCSS(json: TTheme): string; + themeToJSON(style: string): TTheme; + penStyleToCSS(penStyle: TPenStyle): string; + penStyleToJSON(penStyleString: string): TPenStyle; + stringToJSON(style: string): { + [key: string]: string; + }; + JSONToString(style: { + [key: string]: string; + }): string; +}; + +declare class Model implements IModel { + #private; + readonly creationTime: number; + modificationDate: number; + currentStroke?: TStroke; + positions: TRecognitionPositions; + rawStrokes: TStroke[]; + selectedStrokes: TStroke[]; + exports?: TExport; + converts?: TExport; + width: number; + height: number; + idle: boolean; + constructor(width?: number, height?: number, creationDate?: number); + mergeExport(exports: TExport): void; + mergeConvert(converts: TExport): void; + private computePressure; + private filterPointByAcquisitionDelta; + addPoint(stroke: TStroke, pointer: TPointer): void; + addStroke(stroke: TStroke): void; + extractUnsentStrokes(): TStroke[]; + initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi?: number): void; + appendToCurrentStroke(point: TPointer): void; + endCurrentStroke(point: TPointer): void; + resetSelectedStrokes(): void; + appendSelectedStrokesFromPoint(point: TPoint): void; + updateStroke(updatedStroke: TStroke): void; + removeStroke(id: string): void; + removeStrokesFromPoint(point: TPoint): string[]; + updatePositionSent(position?: number): void; + updatePositionReceived(): void; + getClone(): IModel; + clear(): void; +} + +declare class Stroke implements TStroke { + id: string; + type: string; + pointerId: number; + pointerType: string; + elementType?: string; + pointers: TPointer[]; + length: number; + style: TPenStyle; + constructor(style: TPenStyle, pointerId: number, pointerType?: string); +} +declare function convertStrokeToJSON(stroke: TStroke): TStrokeJSON; + +declare class SmartGuide { + #private; + uuid: string; + margin: TMarginConfiguration; + renderingConfiguration: TRenderingConfiguration; + jiix?: TJIIXExport; + lastWord?: TWordExport; + wordToChange?: TWordExport; + constructor(); + get internalEvent(): InternalEvent; + init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void; + resize(): void; + update(exports: TJIIXExport): void; + clear(): void; + destroy(): void; +} + +export { CanvasRenderer, CanvasStroker, Configuration, _default$1 as Constants, DefaultConfiguration, DefaultEventsConfiguration, DefaultGrabberConfiguration, DefaultPenStyle, DefaultRecognitionConfiguration, DefaultRenderingConfiguration, DefaultServerConfiguration, DefaultTheme, DefaultTriggerConfiguration, DefaultUndoRedoConfiguration, DeferredPromise, Editor, InternalEvent, ModeInteraction$1 as ModeInteraction, Model, PointerEventGrabber, PublicEvent, RestBehaviors, RestRecognizer, SVGStroker, SmartGuide, Stroke, _default as StyleHelper, StyleManager, UndoRedoContext, UndoRedoManager, WSBehaviors, WSRecognizer, WSSVGRenderer, CanvasRendererShapeSymbol as canvasRendererShape, CanvasRendererStrokeSymbol as canvasRendererStroke, CanvasRendererTextSymbol as canvasRendererText, computeHmac, convertStrokeToJSON, geometric, getAvailableFontList, getAvailableLanguageList, QuadraticUtils as quadradicsUtils, version }; +//# sourceMappingURL=iink.d.ts.map diff --git a/dist/iink.d.ts.map b/dist/iink.d.ts.map new file mode 100644 index 00000000..b80bbe58 --- /dev/null +++ b/dist/iink.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/iink.esm.js b/dist/iink.esm.js new file mode 100644 index 00000000..6167272d --- /dev/null +++ b/dist/iink.esm.js @@ -0,0 +1,2 @@ +function __awaiter(i,n,s,a){return new(s||(s=Promise))((function(l,d){function fulfilled(i){try{step(a.next(i))}catch(i){d(i)}}function rejected(i){try{step(a.throw(i))}catch(i){d(i)}}function step(i){i.done?l(i.value):function adopt(i){return i instanceof s?i:new s((function(n){n(i)}))}(i.value).then(fulfilled,rejected)}step((a=a.apply(i,n||[])).next())}))}function __classPrivateFieldGet(i,n,s,a){if("a"===s&&!a)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?i!==n||!a:!n.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?a:"a"===s?a.call(i):a?a.value:n.get(i)}function __classPrivateFieldSet(i,n,s,a,l){if("m"===a)throw new TypeError("Private method is not writable");if("a"===a&&!l)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?i!==n||!l:!n.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===a?l.call(i,s):l?l.value=s:n.set(i,s),s}const i={NO_ACTIVITY:"Session closed due to no activity.",WRONG_CREDENTIALS:"Application credentials are invalid. Please check or regenerate your application key and hmackey.",TOO_OLD:"Session is too old. Max Session Duration Reached.",UNKNOW:"An unknown error has occurred.",ABNORMAL_CLOSURE:"MyScript recognition server is not reachable.",CANT_ESTABLISH:"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.",GOING_AWAY:"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.",PROTOCOL_ERROR:"MyScript recognition server terminated the connection due to a protocol error.",UNSUPPORTED_DATA:"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)",INVALID_FRAME_PAULOAD:"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).",POLICY_VIOLATION:"MyScript recognition server terminated the connection because it received a message that violates its policy.",MESSAGE_TOO_BIG:"MyScript recognition server terminated the connection because a data frame was received that is too large.",INTERNAL_ERROR:"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.",SERVICE_RESTART:"MyScript recognition server terminated the connection because it is restarting.",TRY_AGAIN:"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.",BAD_GATEWAY:"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.",TLS_HANDSHAKE:"MyScript recognition server connection was closed due to a failure to perform a TLS handshake"},n={CHANGED:"changed",CLEARED:"cleared",CONVERTED:"converted",ERROR:"error",POINTEREVENTS:"pointer_events",EXPORTED:"exported",IMPORTED:"imported",IDLE:"idle",LOADED:"loaded"},s={SVG_PATCH:"internal_svg_patch",EXPORTED:"internal_exported",CLEAR_MESSAGE:"internal_clear_message",ERROR:"internal_error",NOTIF:"internal_notif",IMPORT_JIIX:"internal_import_jiix",CONVERT:"internal_convert",CLEAR:"internal_clear",CONTEXT_CHANGE:"internal_context_change",IDLE:"internal_idle",WS_CLOSED:"internal_websocket_closed"},a={CLOSE_RECOGNIZER:"CLOSE_RECOGNIZER"},l={JIIX:"application/vnd.myscript.jiix",TEXT:"text/plain",LATEX:"application/x-latex",MATHML:"application/mathml+xml",SVG:"image/svg+xml",OFFICE_DOCUMENT:"application/vnd.openxmlformats-officedocument.presentationml.presentation"};var d;!function(i){i.Writing="writing",i.Erasing="erasing"}(d||(d={}));var c,h,u,p,v,m,g,_,f,y,P,w,x,S,b,E,C,k,M,G,T,L,I,A,D,O,N,R,W,z,j,H,X,B,$,U,J,V,Y,q,Z,K,Q,ee,te,ie,ne,se,re={Error:i,EventType:n,InternalEventType:s,Exports:l,WSMessage:a};class PublicEvent extends EventTarget{constructor(){super(),c.add(this),p.set(this,void 0)}static getInstance(){return __classPrivateFieldGet(PublicEvent,h,"f",u)||__classPrivateFieldSet(PublicEvent,h,new PublicEvent,"f",u),__classPrivateFieldGet(PublicEvent,h,"f",u)}setElement(i){__classPrivateFieldSet(this,p,i,"f")}emitLoaded(){__classPrivateFieldGet(this,c,"m",v).call(this,n.LOADED)}emitExported(i){__classPrivateFieldGet(this,c,"m",v).call(this,n.EXPORTED,i)}emitChanged(i){__classPrivateFieldGet(this,c,"m",v).call(this,n.CHANGED,Object.assign(Object.assign({},i),{canClear:!i.empty}))}emitIdle(i){__classPrivateFieldGet(this,c,"m",v).call(this,n.IDLE,i)}emitCleared(i){__classPrivateFieldGet(this,c,"m",v).call(this,n.CLEARED,i)}emitConverted(i){__classPrivateFieldGet(this,c,"m",v).call(this,n.CONVERTED,i)}emitImported(i){__classPrivateFieldGet(this,c,"m",v).call(this,n.IMPORTED,i)}}h=PublicEvent,p=new WeakMap,c=new WeakSet,v=function _PublicEvent_emit(i,n){var s;const a=new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},n?{detail:n}:void 0));this.dispatchEvent(a),null===(s=__classPrivateFieldGet(this,p,"f"))||void 0===s||s.dispatchEvent(a)},u={value:void 0};class InternalEvent extends EventTarget{constructor(){super(),m.add(this),f.set(this,void 0),__classPrivateFieldSet(this,f,new AbortController,"f")}static getInstance(){return __classPrivateFieldGet(InternalEvent,g,"f",_)||__classPrivateFieldSet(InternalEvent,g,new InternalEvent,"f",_),__classPrivateFieldGet(InternalEvent,g,"f",_)}removeAllListeners(){__classPrivateFieldGet(this,f,"f").abort()}emitSVGPatch(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.SVG_PATCH,i)}addSVGPatchListener(i){this.addEventListener(s.SVG_PATCH,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitExported(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.EXPORTED,i)}addExportedListener(i){this.addEventListener(s.EXPORTED,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitClearMessage(){__classPrivateFieldGet(this,m,"m",y).call(this,s.CLEAR_MESSAGE)}addClearMessageListener(i){this.addEventListener(s.CLEAR_MESSAGE,(()=>i()),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitError(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.ERROR,i)}addErrorListener(i){this.addEventListener(s.ERROR,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitWSClosed(){__classPrivateFieldGet(this,m,"m",y).call(this,s.WS_CLOSED)}addWSClosedListener(i){this.addEventListener(s.WS_CLOSED,(()=>i()),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitNotif(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.NOTIF,i)}addNotifListener(i){this.addEventListener(s.NOTIF,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitImportJIIX(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.IMPORT_JIIX,i)}addImportJIIXListener(i){this.addEventListener(s.IMPORT_JIIX,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitConvert(i="DIGITAL_EDIT"){__classPrivateFieldGet(this,m,"m",y).call(this,s.CONVERT,i)}addConvertListener(i){this.addEventListener(s.CONVERT,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitClear(){__classPrivateFieldGet(this,m,"m",y).call(this,s.CLEAR)}addClearListener(i){this.addEventListener(s.CLEAR,(()=>i()),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitContextChange(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.CONTEXT_CHANGE,i)}addContextChangeListener(i){this.addEventListener(s.CONTEXT_CHANGE,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}emitIdle(i){__classPrivateFieldGet(this,m,"m",y).call(this,s.IDLE,i)}addIdleListener(i){this.addEventListener(s.IDLE,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,f,"f").signal})}}g=InternalEvent,f=new WeakMap,m=new WeakSet,y=function _InternalEvent_emit(i,n){this.dispatchEvent(new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},n?{detail:n}:void 0)))},_={value:void 0};class SmartGuide{constructor(){P.add(this),w.set(this,void 0),x.set(this,void 0),S.set(this,void 0),b.set(this,void 0),E.set(this,void 0),C.set(this,void 0),k.set(this,void 0),M.set(this,void 0),G.set(this,void 0),T.set(this,void 0),L.set(this,void 0),I.set(this,void 0),J.set(this,(i=>{var n,s,a,l,d;const c=parseInt(i.id.replace("word-","").replace(this.uuid,"")),h=null===(n=this.jiix)||void 0===n?void 0:n.words;if(this.wordToChange=h[c],this.wordToChange&&(this.wordToChange.id=c.toString(),__classPrivateFieldGet(this,C,"f").innerHTML="",null===(s=this.wordToChange)||void 0===s?void 0:s.candidates)){__classPrivateFieldGet(this,C,"f").style.display="flex",this.wordToChange.candidates.forEach(((i,n)=>{var s;(null===(s=this.wordToChange)||void 0===s?void 0:s.label)===i?__classPrivateFieldGet(this,C,"f").innerHTML+=`${i}`:__classPrivateFieldGet(this,C,"f").innerHTML+=`${i}`}));const n=48,s=i.getBoundingClientRect().left-60;__classPrivateFieldGet(this,C,"f").style.top=`${n}px`,__classPrivateFieldGet(this,C,"f").style.left=`${s}px`;const c=null===(l=null===(a=i.parentNode)||void 0===a?void 0:a.parentNode)||void 0===l?void 0:l.parentNode;c&&c.insertBefore(__classPrivateFieldGet(this,C,"f"),null===(d=i.parentNode)||void 0===d?void 0:d.parentNode)}})),Z.set(this,(i=>{i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,I,"f")?__classPrivateFieldGet(this,P,"m",q).call(this):__classPrivateFieldGet(this,P,"m",Y).call(this),__classPrivateFieldGet(this,P,"m",V).call(this)})),K.set(this,(i=>{i.preventDefault(),i.stopPropagation(),this.internalEvent.emitConvert(),__classPrivateFieldGet(this,P,"m",q).call(this)})),Q.set(this,(i=>__awaiter(this,void 0,void 0,(function*(){i.preventDefault(),i.stopPropagation();try{__classPrivateFieldGet(this,P,"m",q).call(this);let i="Nothing to copy";__classPrivateFieldGet(this,S,"f").innerText&&(i=`"${__classPrivateFieldGet(this,S,"f").innerText}" copied to clipboard`,yield navigator.clipboard.writeText(__classPrivateFieldGet(this,S,"f").innerText)),this.internalEvent.emitNotif({message:i,timeout:1500})}catch(i){this.internalEvent.emitError(i)}})))),ee.set(this,(i=>{i.preventDefault(),i.stopPropagation(),this.internalEvent.emitClear(),__classPrivateFieldGet(this,P,"m",q).call(this)})),te.set(this,(i=>{var n,s,a,l;i.preventDefault(),i.stopPropagation();const d=i.target.innerText;this.jiix&&d!==(null===(n=this.wordToChange)||void 0===n?void 0:n.label)&&(null===(a=null===(s=this.wordToChange)||void 0===s?void 0:s.candidates)||void 0===a?void 0:a.includes(d))&&(this.jiix.words[parseInt(null===(l=this.wordToChange)||void 0===l?void 0:l.id)].label=d,this.internalEvent.emitImportJIIX(this.jiix)),__classPrivateFieldGet(this,C,"f").style.display="none"})),ie.set(this,(i=>{i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,P,"m",q).call(this);const n=i.target;n.id!==__classPrivateFieldGet(this,S,"f").id?__classPrivateFieldGet(this,J,"f").call(this,n):__classPrivateFieldGet(this,P,"m",V).call(this)})),ne.set(this,(()=>{__classPrivateFieldGet(this,P,"m",V).call(this),__classPrivateFieldGet(this,P,"m",q).call(this)})),this.uuid=Math.random().toString(10).substring(2,12),this.margin={bottom:0,left:0,right:0,top:0},__classPrivateFieldGet(this,P,"m",A).call(this),__classPrivateFieldGet(this,P,"m",D).call(this),__classPrivateFieldGet(this,P,"m",O).call(this),__classPrivateFieldGet(this,P,"m",N).call(this),__classPrivateFieldGet(this,P,"m",R).call(this),__classPrivateFieldGet(this,P,"m",W).call(this),__classPrivateFieldGet(this,P,"m",z).call(this),__classPrivateFieldGet(this,P,"m",j).call(this),__classPrivateFieldGet(this,P,"m",H).call(this),__classPrivateFieldGet(this,P,"m",X).call(this)}get internalEvent(){return InternalEvent.getInstance()}init(i,n,s){i.appendChild(__classPrivateFieldGet(this,w,"f")),__classPrivateFieldGet(this,w,"f").appendChild(__classPrivateFieldGet(this,E,"f")),__classPrivateFieldGet(this,x,"f").appendChild(__classPrivateFieldGet(this,S,"f")),__classPrivateFieldGet(this,w,"f").appendChild(__classPrivateFieldGet(this,x,"f")),__classPrivateFieldGet(this,w,"f").appendChild(__classPrivateFieldGet(this,b,"f")),__classPrivateFieldGet(this,k,"f").appendChild(__classPrivateFieldGet(this,M,"f")),__classPrivateFieldGet(this,k,"f").appendChild(__classPrivateFieldGet(this,G,"f")),__classPrivateFieldGet(this,k,"f").appendChild(__classPrivateFieldGet(this,T,"f")),__classPrivateFieldGet(this,w,"f").appendChild(__classPrivateFieldGet(this,k,"f")),__classPrivateFieldGet(this,k,"f").classList.add("close"),__classPrivateFieldSet(this,I,!1,"f"),__classPrivateFieldGet(this,w,"f").appendChild(__classPrivateFieldGet(this,C,"f")),__classPrivateFieldGet(this,C,"f").style.display="none",this.margin=n,this.renderingConfiguration=s,__classPrivateFieldGet(this,P,"m",se).call(this),__classPrivateFieldGet(this,P,"m",$).call(this),this.renderingConfiguration.smartGuide.fadeOut.enable&&__classPrivateFieldGet(this,P,"m",B).call(this,this.renderingConfiguration.smartGuide.fadeOut.duration),this.resize()}resize(){const i=3.779527559,n=this.margin.top*i,s=this.margin.left*i,a=this.margin.right*i,l=n-45.354330708;__classPrivateFieldGet(this,w,"f").style.top=`${l}px`,__classPrivateFieldGet(this,w,"f").style.left=`${s}px`,__classPrivateFieldGet(this,w,"f").style.right=`${a}px`;let d=__classPrivateFieldGet(this,E,"f").offsetWidth;__classPrivateFieldGet(this,x,"f").style.marginLeft=`${d}px`,__classPrivateFieldGet(this,x,"f").style.width=__classPrivateFieldGet(this,w,"f").clientWidth-__classPrivateFieldGet(this,E,"f").offsetWidth-__classPrivateFieldGet(this,b,"f").offsetHeight+"px",d+=__classPrivateFieldGet(this,x,"f").offsetWidth,__classPrivateFieldGet(this,k,"f").style.left=`${d-__classPrivateFieldGet(this,k,"f").offsetWidth+__classPrivateFieldGet(this,b,"f").offsetWidth}px`,__classPrivateFieldGet(this,k,"f").style.top=`${__classPrivateFieldGet(this,b,"f").offsetHeight}px`,__classPrivateFieldGet(this,b,"f").style.left=`${d}px`}update(i){var n,s;this.jiix=i;const createWordSpan=(i,n)=>{const s=document.createElement("span");return s.id=`word-${i}${this.uuid}`,n?s.textContent=n.label:s.innerHTML=" ",s};(()=>{var i;if(__classPrivateFieldGet(this,S,"f").innerHTML="",null===(i=this.jiix)||void 0===i?void 0:i.words){const i=this.jiix.words,n=document.createDocumentFragment();i.forEach(((s,a)=>{var l,d;if(" "===s.label||s.label.includes("\n"))n.appendChild(createWordSpan(a));else if(a!==i.length-1)n.appendChild(createWordSpan(a,s));else{__classPrivateFieldGet(this,S,"f").appendChild(n),this.lastWord&&(this.lastWord=s);const i=createWordSpan(a,s);(null===(l=this.lastWord)||void 0===l?void 0:l.candidates)!==s.candidates&&(null===(d=this.lastWord)||void 0===d?void 0:d.label)!==s.label?(i.classList.add("added-word"),__classPrivateFieldGet(this,S,"f").appendChild(i),__classPrivateFieldGet(this,x,"f").scrollLeft=i.offsetLeft,this.lastWord=s):(__classPrivateFieldGet(this,S,"f").appendChild(i),__classPrivateFieldGet(this,x,"f").scrollLeft=i.offsetLeft)}}))}})(),(null===(s=null===(n=this.jiix)||void 0===n?void 0:n.words)||void 0===s?void 0:s.length)&&__classPrivateFieldGet(this,P,"m",$).call(this)}clear(){__classPrivateFieldGet(this,S,"f").innerHTML="",__classPrivateFieldGet(this,C,"f").innerHTML="",__classPrivateFieldGet(this,P,"m",U).call(this)}destroy(){__classPrivateFieldGet(this,w,"f").innerHTML=""}}w=new WeakMap,x=new WeakMap,S=new WeakMap,b=new WeakMap,E=new WeakMap,C=new WeakMap,k=new WeakMap,M=new WeakMap,G=new WeakMap,T=new WeakMap,L=new WeakMap,I=new WeakMap,J=new WeakMap,Z=new WeakMap,K=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ie=new WeakMap,ne=new WeakMap,P=new WeakSet,A=function _SmartGuide_createWrapperElement(){__classPrivateFieldSet(this,w,document.createElement("div"),"f"),__classPrivateFieldGet(this,w,"f").id=`smartguide-${this.uuid}`,__classPrivateFieldGet(this,w,"f").classList.add("smartguide")},D=function _SmartGuide_createPrompterContainerElement(){__classPrivateFieldSet(this,x,document.createElement("div"),"f"),__classPrivateFieldGet(this,x,"f").id=`prompter-container-${this.uuid}`,__classPrivateFieldGet(this,x,"f").classList.add("prompter-container")},O=function _SmartGuide_createPrompterTextElement(){__classPrivateFieldSet(this,S,document.createElement("div"),"f"),__classPrivateFieldGet(this,S,"f").id=`prompter-text-${this.uuid}`,__classPrivateFieldGet(this,S,"f").classList.add("prompter-text"),__classPrivateFieldGet(this,S,"f").setAttribute("touch-action","none")},N=function _SmartGuide_createEllipsisElement(){__classPrivateFieldSet(this,b,document.createElement("div"),"f"),__classPrivateFieldGet(this,b,"f").id=`ellipsis-${this.uuid}`,__classPrivateFieldGet(this,b,"f").classList.add("ellipsis"),__classPrivateFieldGet(this,b,"f").innerHTML="..."},R=function _SmartGuide_createTagElement(){__classPrivateFieldSet(this,E,document.createElement("div"),"f"),__classPrivateFieldGet(this,E,"f").id=`tag-icon-${this.uuid}`,__classPrivateFieldGet(this,E,"f").classList.add("tag-icon"),__classPrivateFieldGet(this,E,"f").innerHTML="¶"},W=function _SmartGuide_createCandidatesElement(){__classPrivateFieldSet(this,C,document.createElement("div"),"f"),__classPrivateFieldGet(this,C,"f").id=`candidates-${this.uuid}`,__classPrivateFieldGet(this,C,"f").classList.add("candidates")},z=function _SmartGuide_createMoreMenuElement(){__classPrivateFieldSet(this,k,document.createElement("div"),"f"),__classPrivateFieldGet(this,k,"f").id=`more-menu-${this.uuid}`,__classPrivateFieldGet(this,k,"f").classList.add("more-menu")},j=function _SmartGuide_createConvertElement(){__classPrivateFieldSet(this,M,document.createElement("button"),"f"),__classPrivateFieldGet(this,M,"f").id=`convert-${this.uuid}`,__classPrivateFieldGet(this,M,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,M,"f").innerHTML="Convert"},H=function _SmartGuide_createCopyElement(){__classPrivateFieldSet(this,G,document.createElement("button"),"f"),__classPrivateFieldGet(this,G,"f").id=`copy-${this.uuid}`,__classPrivateFieldGet(this,G,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,G,"f").innerHTML="Copy"},X=function _SmartGuide_createDeleteElement(){__classPrivateFieldSet(this,T,document.createElement("button"),"f"),__classPrivateFieldGet(this,T,"f").id=`delete-${this.uuid}`,__classPrivateFieldGet(this,T,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,T,"f").innerHTML="Delete"},B=function _SmartGuide_initFadeOutObserver(i=3e3){new MutationObserver((()=>{clearTimeout(__classPrivateFieldGet(this,L,"f")),__classPrivateFieldGet(this,w,"f").classList.contains("smartguide-out")||"none"!==__classPrivateFieldGet(this,C,"f").style.display||__classPrivateFieldGet(this,I,"f")||__classPrivateFieldSet(this,L,setTimeout((()=>{__classPrivateFieldGet(this,P,"m",U).call(this)}),i),"f")})).observe(__classPrivateFieldGet(this,w,"f"),{childList:!0,subtree:!0,attributes:!0})},$=function _SmartGuide_show(){__classPrivateFieldGet(this,w,"f").classList.remove("smartguide-out"),__classPrivateFieldGet(this,w,"f").classList.add("smartguide-in")},U=function _SmartGuide_hide(){__classPrivateFieldGet(this,w,"f").classList.add("smartguide-out"),__classPrivateFieldGet(this,w,"f").classList.remove("smartguide-in")},V=function _SmartGuide_hideCandidates(){__classPrivateFieldGet(this,C,"f").style.display="none"},Y=function _SmartGuide_openMenu(){__classPrivateFieldGet(this,k,"f").classList.add("open"),__classPrivateFieldGet(this,k,"f").classList.remove("close"),__classPrivateFieldSet(this,I,!0,"f")},q=function _SmartGuide_closeMenu(){__classPrivateFieldGet(this,k,"f").classList.add("close"),__classPrivateFieldGet(this,k,"f").classList.remove("open"),__classPrivateFieldSet(this,I,!1,"f")},se=function _SmartGuide_addListeners(){__classPrivateFieldGet(this,b,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,Z,"f").call(this,i))),__classPrivateFieldGet(this,M,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,K,"f").call(this,i))),__classPrivateFieldGet(this,G,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,Q,"f").call(this,i))),__classPrivateFieldGet(this,T,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,ee,"f").call(this,i))),__classPrivateFieldGet(this,S,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,ie,"f").call(this,i))),__classPrivateFieldGet(this,C,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,te,"f").call(this,i))),document.addEventListener("pointerdown",(()=>__classPrivateFieldGet(this,ne,"f").call(this)))};class DeferredPromise{constructor(){this.isFullFilled=!1,this.isPending=!0,this.promise=new Promise(((i,n)=>{this.reject=i=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,n(i)})),this.resolve=n=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,i(n)}))}))}}class PointerEventGrabber{constructor(i){this.prevent=i=>i.preventDefault(),this.pointerDownHandler=i=>{if(0===i.button&&1===i.buttons&&(this.activePointerId=i.pointerId,this.onPointerDown)){const n=this.extractPoint(i);this.onPointerDown(i,n)}},this.pointerMoveHandler=i=>{if(null!=this.activePointerId&&this.activePointerId===i.pointerId&&this.onPointerMove){const n=this.extractPoint(i);this.onPointerMove(i,n)}},this.pointerUpHandler=i=>{if(null!=this.activePointerId&&this.activePointerId===i.pointerId&&(this.activePointerId=void 0,i.stopPropagation(),this.onPointerUp)){const n=this.extractPoint(i);this.onPointerUp(i,n)}},this.configuration=i}roundFloat(i,n){if(n>=0){const s=Math.pow(10,n);return Math.round(i/s)*s}return i}extractPoint(i){let n,s;({clientX:n,clientY:s}="changedTouches"in i?i.changedTouches[0]:i);const a=this.domElement.getBoundingClientRect();return{x:this.roundFloat(n-a.left-this.domElement.clientLeft,this.configuration.xyFloatPrecision),y:this.roundFloat(s-a.top-this.domElement.clientTop,this.configuration.xyFloatPrecision),t:this.roundFloat(Date.now(),this.configuration.timestampFloatPrecision),p:i.pressure||1}}attach(i){this.domElement&&this.detach(),this.domElement=i,this.domElement.addEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("touchmove",this.prevent),document.documentElement.addEventListener("pointerdown",(()=>{}))}detach(){var i,n,s,a,l,d;null===(i=this.domElement)||void 0===i||i.removeEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),null===(n=this.domElement)||void 0===n||n.removeEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),null===(s=this.domElement)||void 0===s||s.removeEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),null===(a=this.domElement)||void 0===a||a.removeEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),null===(l=this.domElement)||void 0===l||l.removeEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),null===(d=this.domElement)||void 0===d||d.removeEventListener("touchmove",this.prevent),document.documentElement.removeEventListener("pointerdown",(()=>{}))}}const oe={table:"table",shape:"shape",recognizedShape:"recognizedShape",ellipse:"ellipse",line:"line"};function phi(i){let n=(i+Math.PI)%(2*Math.PI)-Math.PI;return n<-Math.PI&&(n+=2*Math.PI),n}function drawArrowHead(i,n,s,a){const l=phi(s+Math.PI*(7/8)),d=phi(s-Math.PI*(7/8));i.save();try{i.fillStyle=i.strokeStyle,i.moveTo(n.x,n.y),i.beginPath(),i.lineTo(n.x+a*Math.cos(l),n.y+a*Math.sin(l)),i.lineTo(n.x+a*Math.cos(d),n.y+a*Math.sin(d)),i.lineTo(n.x,n.y),i.fill()}finally{i.restore()}}function drawShapeEllipse(i,n){const s=function drawEllipseArc(i,n){const{centerPoint:s,maxRadius:a,minRadius:l,orientation:d,startAngle:c,sweepAngle:h}=n;let u=Math.cos(d),p=Math.sin(d),v=u,m=p;u*=a,v*=l,p*=a,m*=l;const g=Math.floor(Math.abs(h)/.02),_=[];i.save();try{i.beginPath();for(let n=0;n<=g;n++){const d=c+n/g*h,f=Math.atan2(Math.sin(d)/l,Math.cos(d)/a),y=Math.cos(f),P=Math.sin(f),w=s.x+u*y-m*P,x=s.y+v*P+p*y;0===n?i.moveTo(w,x):i.lineTo(w,x),0!==n&&n!==g||_.push({x:w,y:x})}i.stroke()}finally{i.restore()}return _}(i,n);"ARROW_HEAD"===(null==n?void 0:n.beginDecoration)&&drawArrowHead(i,s[0],n.beginTangentAngle,12),"ARROW_HEAD"===(null==n?void 0:n.endDecoration)&&drawArrowHead(i,s[1],n.endTangentAngle,12)}function drawLine(i,n,s){i.save();try{i.beginPath(),i.moveTo(n.x,n.y),i.lineTo(s.x,s.y),i.stroke()}finally{i.restore()}}function drawShapeSymbol(i,n){i.save();try{if(i.lineWidth=n.style.width,i.strokeStyle=n.style.color,n.elementType)switch(n.elementType){case oe.shape:{const s=n;drawShapeSymbol(i,s.candidates[s.selectedCandidateIndex]);break}case oe.table:n.lines.forEach((n=>drawShapeSymbol(i,n)));break;case oe.line:{const s=n;drawLine(i,s.data.p1,s.data.p2);break}}else switch(n.type){case oe.ellipse:drawShapeEllipse(i,n);break;case oe.line:!function drawShapeLine(i,n){drawLine(i,n.firstPoint,n.lastPoint),"ARROW_HEAD"===n.beginDecoration&&drawArrowHead(i,n.firstPoint,n.beginTangentAngle,12),"ARROW_HEAD"===n.endDecoration&&drawArrowHead(i,n.lastPoint,n.endTangentAngle,12)}(i,n);break;case oe.recognizedShape:n.primitives.forEach((n=>drawShapeSymbol(i,n)));break}}finally{i.restore()}}var ae=Object.freeze({__proto__:null,ShapeSymbols:oe,drawLine:drawLine,drawShapeSymbol:drawShapeSymbol});function drawStroke(i,n,s){s&&n&&"eraser"!==n.pointerType&&s.drawStroke(i,n)}var le=Object.freeze({__proto__:null,drawStroke:drawStroke});const de={inputCharacter:"inputCharacter",char:"char",string:"string",textLine:"textLine"};function drawTextLine(i,n){!function drawText(i,n,s){i.save();try{i.font=`${s.textHeight}px serif`,i.textAlign="CENTER"===s.justificationType?"center":"left",i.textBaseline="bottom",i.fillStyle=i.strokeStyle,i.fillText(n,s.topLeftPoint.x,s.topLeftPoint.y+s.height)}finally{i.restore()}}(i,n.label,n.data),n.underlineList.forEach((s=>{!function drawUnderline(i,n,s,a){const l=a.width/s.length;drawLine(i,{x:a.topLeftPoint.x+n.data.firstCharacter*l,y:a.topLeftPoint.y+a.height},{x:a.topLeftPoint.x+n.data.lastCharacter*l,y:a.topLeftPoint.y+a.height})}(i,s,n.label,n.data)}))}function drawTextSymbol(i,n){i.save();try{i.lineWidth=n.style.width,i.strokeStyle=n.style.color;if((n.elementType||n.type)===de.textLine)drawTextLine(i,n);else console.info(`drawTextSymbol => ${n.elementType} not implemented`)}finally{i.restore()}}var ce=Object.freeze({__proto__:null,TextSymbols:de,drawTextSymbol:drawTextSymbol});function computeLinksPoints(i,n,s){const a=i.p*s;return[{x:i.x-Math.sin(n)*a,y:i.y+Math.cos(n)*a},{x:i.x+Math.sin(n)*a,y:i.y-Math.cos(n)*a}]}function computeMiddlePoint(i,n){return{x:(n.x+i.x)/2,y:(n.y+i.y)/2,p:(n.p+i.p)/2,t:(n.t+i.t)/2}}function computeAxeAngle(i,n){return Math.atan2(n.y-i.y,n.x-i.x)}var he=Object.freeze({__proto__:null,computeLinksPoints:computeLinksPoints,computeMiddlePoint:computeMiddlePoint,computeAxeAngle:computeAxeAngle});class CanvasStroker{renderArc(i,n,s){i.arc(n.x,n.y,s,0,2*Math.PI,!0)}renderLine(i,n,s,a){const l=computeLinksPoints(n,computeAxeAngle(n,s),a),d=computeLinksPoints(s,computeAxeAngle(n,s),a);i.moveTo(l[0].x,l[0].y),i.lineTo(d[0].x,d[0].y),i.lineTo(d[1].x,d[1].y),i.lineTo(l[1].x,l[1].y)}renderFinal(i,n,s,a){const l=computeAxeAngle(n,s),d=computeLinksPoints(s,l,a);i.moveTo(d[0].x,d[0].y);for(let n=1;n<=6;n++){const d=l-n*Math.PI/6;i.lineTo(s.x-s.p*a*Math.sin(d),s.y+s.p*a*Math.cos(d))}}renderQuadratic(i,n,s,a,l){const d=computeLinksPoints(n,computeAxeAngle(n,a),l),c=computeLinksPoints(s,computeAxeAngle(a,s),l),h=computeLinksPoints(a,computeAxeAngle(n,s),l);i.moveTo(d[0].x,d[0].y),i.quadraticCurveTo(h[0].x,h[0].y,c[0].x,c[0].y),i.lineTo(c[1].x,c[1].y),i.quadraticCurveTo(h[1].x,h[1].y,d[1].x,d[1].y)}drawStroke(i,n){const s=n.pointers.length,a=s-2,l=n.style.width>0?n.style.width:i.lineWidth,d=n.style.color?n.style.color:i.strokeStyle,c=n.pointers[0];i.save();try{if(i.beginPath(),s<3)this.renderArc(i,c,.6*l);else{this.renderArc(i,c,l*c.p);const d=computeMiddlePoint(c,n.pointers[1]);this.renderLine(i,c,d,l);for(let s=0;s{var s;const a=n.parentNode,l=Math.max(this.config.minWidth,a.clientWidth),d=Math.max(this.config.minHeight,a.clientHeight);n.width=l*i,n.height=d*i,null===(s=n.getContext("2d"))||void 0===s||s.scale(i,i),n.style.width=`${l}px`,n.style.height=`${d}px`}))}drawSymbol(i,n){const s=n.elementType||n.type;"stroke"===s?drawStroke(i,n,this.stroker):Object.keys(de).includes(s)?drawTextSymbol(i,n):Object.keys(oe).includes(s)&&drawShapeSymbol(i,n)}init(i){const n=this.createCanvas("ms-rendering-canvas");i.appendChild(n);const s=this.createCanvas("ms-capture-canvas");i.appendChild(s),this.context={parent:i,renderingCanvas:n,renderingCanvasContext:n.getContext("2d"),capturingCanvas:s,capturingCanvasContext:s.getContext("2d")},this.resizeContent()}drawModel(i){var n;null===(n=this.context.renderingCanvasContext)||void 0===n||n.clearRect(0,0,this.context.renderingCanvas.width,this.context.renderingCanvas.height),i.rawStrokes.forEach((i=>this.drawSymbol(this.context.renderingCanvasContext,i))),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height)}drawPendingStroke(i){this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height),i&&"eraser"!==(null==i?void 0:i.pointerType)&&this.stroker.drawStroke(this.context.capturingCanvasContext,i)}resize(i){this.resizeContent(),this.drawModel(i)}destroy(){this.context.parent&&(this.context.parent.innerHTML="")}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function createCommonjsModule(i,n){return i(n={exports:{}},n.exports),n.exports}var ue=createCommonjsModule((function(i,n){i.exports=function(i){function e(s){if(n[s])return n[s].exports;var a=n[s]={i:s,l:!1,exports:{}};return i[s].call(a.exports,a,a.exports,e),a.l=!0,a.exports}var n={};return e.m=i,e.c=n,e.i=function(i){return i},e.d=function(i,n,s){e.o(i,n)||Object.defineProperty(i,n,{configurable:!1,enumerable:!0,get:s})},e.n=function(i){var n=i&&i.__esModule?function(){return i.default}:function(){return i};return e.d(n,"a",n),n},e.o=function(i,n){return Object.prototype.hasOwnProperty.call(i,n)},e.p="",e(e.s=1)}([function(i,n,s){function o(i,n){if(!(i instanceof n))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},l=function t(i){var n=this;o(this,t),this.toJSON=function(i){if("string"!=typeof i)return console.error("Need a CSS string but given ",void 0===i?"undefined":a(i),i),"Not a valid CSS..!";var s={},l=void 0,d=void 0,c=void 0;try{i.split("{").forEach((function(i){if(d=i.trim())if(-1===d.indexOf("}"))s[d]={},l=d;else{d.substring(0,d.indexOf("}")).split(";").forEach((function(i){(c=i.split(":"))&&2===c.length&&(s[l][c[0].trim().replace(/^\"|\"$/g,"")]=n._trimSemiColon(c[1].trim().replace(/^\"|\"$/g,"")))}));try{(l=d.split("}")[1].trim())&&(s[l]={})}catch(i){}}}))}catch(i){return"Not a valid CSS..!"}return s},this.toCSS=function(i){if("object"!==(void 0===i?"undefined":a(i)))return console.error("Need a JSON object but given ",void 0===i?"undefined":a(i),i),"Not a valid JSON..!";var n="";try{for(var s in i)if(i.hasOwnProperty(s)){for(var l in n+=s+" {\n",i[s])i[s].hasOwnProperty(l)&&(n+=l+": "+i[s][l]+";\n");n+="}\n"}}catch(i){return"Not a valid JSON..!"}return n},this._trimSemiColon=function(i){return";"===i.slice(-1)?i.slice(0,n.length-1):i}};n.default=l},function(i,n,s){i.exports=s(0).default}])})),pe=function unwrapExports(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}(ue);ue.JsonCSS;const ve=new pe;var me={themeToCSS:i=>ve.toCSS(i),themeToJSON(i){const n=ve.toJSON(i);return n[".text"]["font-size"]=Number(n[".text"]["font-size"]),n.ink["-myscript-pen-width"]=Number(n.ink["-myscript-pen-width"]),n.ink.width=Number(n.ink.width),n},penStyleToCSS(i){let n=ve.toCSS({css:i});return n=n.substring(6,n.length-3),n},penStyleToJSON(i){const n=ve.toJSON(`css {${i}}`).css;return n.width?n.width=Number(n.width):delete n.width,n["-myscript-pen-width"]?n["-myscript-pen-width"]=Number(n["-myscript-pen-width"]):delete n["-myscript-pen-width"],n},stringToJSON:i=>ve.toJSON(`css {${i}}`).css,JSONToString:i=>Object.entries(i).map((([i,n])=>`${i}:${n}`)).join(";")},ge=createCommonjsModule((function(i,n){var s;i.exports=(s=s||function(i,n){var s=Object.create||function(){function F(){}return function(i){var n;return F.prototype=i,n=new F,F.prototype=null,n}}(),a={},l=a.lib={},d=l.Base={extend:function(i){var n=s(this);return i&&n.mixIn(i),n.hasOwnProperty("init")&&this.init!==n.init||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var i=this.extend();return i.init.apply(i,arguments),i},init:function(){},mixIn:function(i){for(var n in i)i.hasOwnProperty(n)&&(this[n]=i[n]);i.hasOwnProperty("toString")&&(this.toString=i.toString)},clone:function(){return this.init.prototype.extend(this)}},c=l.WordArray=d.extend({init:function(i,s){i=this.words=i||[],this.sigBytes=s!=n?s:4*i.length},toString:function(i){return(i||u).stringify(this)},concat:function(i){var n=this.words,s=i.words,a=this.sigBytes,l=i.sigBytes;if(this.clamp(),a%4)for(var d=0;d>>2]>>>24-d%4*8&255;n[a+d>>>2]|=c<<24-(a+d)%4*8}else for(d=0;d>>2]=s[d>>>2];return this.sigBytes+=l,this},clamp:function(){var n=this.words,s=this.sigBytes;n[s>>>2]&=4294967295<<32-s%4*8,n.length=i.ceil(s/4)},clone:function(){var i=d.clone.call(this);return i.words=this.words.slice(0),i},random:function(n){for(var s,a=[],r=function(n){var s=987654321,a=4294967295;return function(){var l=((s=36969*(65535&s)+(s>>16)&a)<<16)+(n=18e3*(65535&n)+(n>>16)&a)&a;return l/=4294967296,(l+=.5)*(i.random()>.5?1:-1)}},l=0;l>>2]>>>24-l%4*8&255;a.push((d>>>4).toString(16)),a.push((15&d).toString(16))}return a.join("")},parse:function(i){for(var n=i.length,s=[],a=0;a>>3]|=parseInt(i.substr(a,2),16)<<24-a%8*4;return new c.init(s,n/2)}},p=h.Latin1={stringify:function(i){for(var n=i.words,s=i.sigBytes,a=[],l=0;l>>2]>>>24-l%4*8&255;a.push(String.fromCharCode(d))}return a.join("")},parse:function(i){for(var n=i.length,s=[],a=0;a>>2]|=(255&i.charCodeAt(a))<<24-a%4*8;return new c.init(s,n)}},v=h.Utf8={stringify:function(i){try{return decodeURIComponent(escape(p.stringify(i)))}catch(i){throw new Error("Malformed UTF-8 data")}},parse:function(i){return p.parse(unescape(encodeURIComponent(i)))}},m=l.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(i){"string"==typeof i&&(i=v.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes},_process:function(n){var s=this._data,a=s.words,l=s.sigBytes,d=this.blockSize,h=l/(4*d),u=(h=n?i.ceil(h):i.max((0|h)-this._minBufferSize,0))*d,p=i.min(4*u,l);if(u){for(var v=0;v>>1|ie<<31)^(te>>>8|ie<<24)^te>>>7,se=(ie>>>1|te<<31)^(ie>>>8|te<<24)^(ie>>>7|te<<25),re=u[q-2],oe=re.high,ae=re.low,le=(oe>>>19|ae<<13)^(oe<<3|ae>>>29)^oe>>>6,de=(ae>>>19|oe<<13)^(ae<<3|oe>>>29)^(ae>>>6|oe<<26),ce=u[q-7],he=ce.high,ue=ce.low,pe=u[q-16],ve=pe.high,me=pe.low;K=(K=(K=ne+he+((Q=se+ue)>>>0>>0?1:0))+le+((Q+=de)>>>0>>0?1:0))+ve+((Q+=me)>>>0>>0?1:0),Z.high=K,Z.low=Q}var ge,_e=H&B^~H&U,fe=X&$^~X&J,ye=A&O^A&R^O&R,Pe=D&N^D&W^N&W,we=(A>>>28|D<<4)^(A<<30|D>>>2)^(A<<25|D>>>7),xe=(D>>>28|A<<4)^(D<<30|A>>>2)^(D<<25|A>>>7),Se=(H>>>14|X<<18)^(H>>>18|X<<14)^(H<<23|X>>>9),be=(X>>>14|H<<18)^(X>>>18|H<<14)^(X<<23|H>>>9),Ee=h[q],Ce=Ee.high,ke=Ee.low,Fe=V+Se+((ge=Y+be)>>>0>>0?1:0),Me=xe+Pe;V=U,Y=J,U=B,J=$,B=H,$=X,H=z+(Fe=(Fe=(Fe=Fe+_e+((ge+=fe)>>>0>>0?1:0))+Ce+((ge+=ke)>>>0>>0?1:0))+K+((ge+=Q)>>>0>>0?1:0))+((X=j+ge|0)>>>0>>0?1:0)|0,z=R,j=W,R=O,W=N,O=A,N=D,A=Fe+(we+ye+(Me>>>0>>0?1:0))+((D=ge+Me|0)>>>0>>0?1:0)|0}f=a.low=f+D,a.high=_+A+(f>>>0>>0?1:0),P=l.low=P+N,l.high=y+O+(P>>>0>>0?1:0),x=d.low=x+W,d.high=w+R+(x>>>0>>0?1:0),b=c.low=b+j,c.high=S+z+(b>>>0>>0?1:0),C=p.low=C+X,p.high=E+H+(C>>>0>>0?1:0),M=v.low=M+$,v.high=k+B+(M>>>0<$>>>0?1:0),T=m.low=T+J,m.high=G+U+(T>>>0>>0?1:0),I=g.low=I+Y,g.high=L+V+(I>>>0>>0?1:0)},_doFinalize:function(){var i=this._data,n=i.words,s=8*this._nDataBytes,a=8*i.sigBytes;return n[a>>>5]|=128<<24-a%32,n[30+(a+128>>>10<<5)]=Math.floor(s/4294967296),n[31+(a+128>>>10<<5)]=s,i.sigBytes=4*n.length,this._process(),this._hash.toX32()},clone:function(){var i=n.clone.call(this);return i._hash=this._hash.clone(),i},blockSize:32});i.SHA512=n._createHelper(p),i.HmacSHA512=n._createHmacHelper(p)}(),s.SHA512)})),createCommonjsModule((function(i,n){var s,a,l;i.exports=(a=(s=ge).lib.Base,l=s.enc.Utf8,void(s.algo.HMAC=a.extend({init:function(i,n){i=this._hasher=new i.init,"string"==typeof n&&(n=l.parse(n));var s=i.blockSize,a=4*s;n.sigBytes>a&&(n=i.finalize(n)),n.clamp();for(var d=this._oKey=n.clone(),c=this._iKey=n.clone(),h=d.words,u=c.words,p=0;p{const s=i.split("."),a=n.split(".");for(let i=0;il)return!1;if(n{n.p.push(i.p),n.t.push(i.t),n.x.push(i.x),n.y.push(i.y)})),n}class RestRecognizer{constructor(i,n){this.serverConfiguration=i,this.recognitionConfiguration=n}get url(){return`${this.serverConfiguration.scheme}://${this.serverConfiguration.host}/api/v4.0/iink/batch`}get postConfig(){switch(this.recognitionConfiguration.type){case"DIAGRAM":return{lang:this.recognitionConfiguration.lang,diagram:this.recognitionConfiguration.diagram,export:this.recognitionConfiguration.export};case"MATH":return{lang:this.recognitionConfiguration.lang,math:this.recognitionConfiguration.math,export:this.recognitionConfiguration.export};case"Raw Content":return{lang:this.recognitionConfiguration.lang,"raw-content":this.recognitionConfiguration["raw-content"],export:this.recognitionConfiguration.export};case"TEXT":return{lang:this.recognitionConfiguration.lang,text:this.recognitionConfiguration.text,export:this.recognitionConfiguration.export};default:throw new Error(`get postConfig error Recognition type unkow "${this.recognitionConfiguration.type}"`)}}buildData(i){const n=[];i.rawStrokes.forEach((i=>{const s=n.findIndex((n=>{return s=n.penStyle,a=i.style,s["-myscript-pen-fill-color"]===a["-myscript-pen-fill-color"]&&s["-myscript-pen-fill-style"]===a["-myscript-pen-fill-style"]&&s["-myscript-pen-width"]===a["-myscript-pen-width"]&&s.color===a.color&&s.width===a.width;var s,a}));s>-1?n[s].strokes.push(i):n.push({penStyle:i.style,strokes:[i]})}));const s=[];n.forEach((i=>{const n={penStyle:"{}"===JSON.stringify(i.penStyle)?void 0:me.penStyleToCSS(i.penStyle),strokes:i.strokes.map(convertStrokeToJSON)};s.push(n)}));const a="Raw Content"===this.recognitionConfiguration.type?"Raw Content":this.recognitionConfiguration.type.charAt(0).toUpperCase()+this.recognitionConfiguration.type.slice(1).toLowerCase();return{configuration:this.postConfig,xDPI:96,yDPI:96,contentType:a,height:i.height,width:i.width,strokeGroups:s}}post(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=new Headers;s.append("Accept","application/json,"+n),s.append("applicationKey",this.serverConfiguration.applicationKey),s.append("hmac",computeHmac(JSON.stringify(i),this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)),s.append("Content-Type","application/json"),isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(s.append("myscript-client-name","iink-ts"),s.append("myscript-client-version","1.0.0-buildVersion"));const a={method:"POST",headers:s,body:JSON.stringify(i)},l=new Request(this.url,a),d=yield fetch(l);if(d.ok){let i;switch(d.headers.get("content-type")){case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"image/png":case"image/jpeg":i=yield d.blob();break;case"application/json":i=yield d.json();break;case"application/vnd.myscript.jiix":i=yield d.clone().json().catch((()=>__awaiter(this,void 0,void 0,(function*(){return yield d.text()}))));break;default:i=yield d.text()}return i}throw yield d.json()}))}tryFetch(n,s){return __awaiter(this,void 0,void 0,(function*(){return this.post(n,s).then((i=>{const n={};return n[s]=i,n})).catch((n=>{let s=n.message||i.UNKNOW;n.code?"access.not.granted"===n.code&&(s=i.WRONG_CREDENTIALS):s=i.CANT_ESTABLISH;throw new Error(s)}))}))}getMimeTypes(i){let n=i||[];if(!n.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":n=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":n=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":n=["application/vnd.myscript.jiix"];break;case"TEXT":n=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}return n}convert(i,n,s){return __awaiter(this,void 0,void 0,(function*(){const a=i.getClone(),l=this.getMimeTypes(s),d=this.buildData(a);d.conversionState=n;const c=l.map((i=>this.tryFetch(d,i)));return(yield Promise.all(c)).forEach((i=>{a.mergeConvert(i)})),a}))}export(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=i.getClone();if(0===s.rawStrokes.length)return Promise.resolve(s);const a=this.getMimeTypes(n);if(!a.length)return Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration"));const l=a.filter((i=>!s.exports||!s.exports[i])),d=this.buildData(i);return(yield Promise.all(l.map((i=>this.tryFetch(d,i))))).forEach((i=>{s.mergeExport(i)})),s}))}resize(i){return __awaiter(this,void 0,void 0,(function*(){return this.export(i)}))}}class UndoRedoContext{constructor(i){this.stackIndex=0,this.possibleUndoCount=0,this.canRedo=!1,this.canUndo=!1,this.empty=!0,this.stack=[i.getClone()]}}class UndoRedoManager{constructor(i,n){this.configuration=i,this.context=new UndoRedoContext(n)}get internalEvent(){return InternalEvent.getInstance()}updateCanUndoRedo(){this.context.canRedo=this.context.stack.length-1>this.context.stackIndex,this.context.canUndo=this.context.stackIndex>0;const i=this.context.stack[this.context.stackIndex];this.context.empty=0===i.rawStrokes.length}addModelToStack(i){this.context.stackIndex+1this.configuration.maxStackSize&&(this.context.stack.shift(),this.context.stackIndex--),this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)}removeLastModelInStack(){this.context.stackIndex===this.context.stack.length-1&&this.context.stackIndex--,this.context.stack.pop(),this.updateCanUndoRedo()}updateModelInStack(i){const n=this.context.stack.findIndex((n=>n.modificationDate===i.modificationDate));n>-1&&this.context.stack.splice(n,1,i.getClone()),this.internalEvent.emitContextChange(this.context)}undo(){return this.context.canUndo&&(this.context.stackIndex--,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)),this.context.stack[this.context.stackIndex].getClone()}redo(){return this.context.canRedo&&(this.context.stackIndex++,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)),this.context.stack[this.context.stackIndex].getClone()}reset(i){this.context=new UndoRedoContext(i),this.internalEvent.emitContextChange(this.context)}}const mergeDeep=(i,...n)=>{const isObject=i=>i&&"object"==typeof i&&!Array.isArray(i);if(!n.length)return i;const s=n.shift();if(isObject(i)&&isObject(s))for(const n in s)isObject(s[n])?(i[n]||Object.assign(i,{[n]:{}}),mergeDeep(i[n],s[n])):Object.assign(i,{[n]:s[n]});return mergeDeep(i,...n)},Pe={},we={ink:{color:"#000000",width:1,"-myscript-pen-width":1,"-myscript-pen-fill-style":"none","-myscript-pen-fill-color":"#FFFFFF00"},".math":{"font-family":"STIXGeneral"},".math-solved":{"font-family":"STIXGeneral",color:"#A8A8A8FF"},".text":{"font-family":"MyScriptInter","font-size":10}};var xe,Se,be,Ee;class StyleManager{constructor(i,n){xe.set(this,void 0),Se.set(this,void 0),be.set(this,void 0),Ee.set(this,void 0),this.setTheme(n),this.setPenStyleClasses(),this.setPenStyle(i)}get currentPenStyle(){return __classPrivateFieldGet(this,Ee,"f")||__classPrivateFieldGet(this,xe,"f")}get penStyle(){return __classPrivateFieldGet(this,xe,"f")}setPenStyle(i){__classPrivateFieldSet(this,xe,mergeDeep(structuredClone(Pe),i||{}),"f"),__classPrivateFieldSet(this,Ee,i||this.theme[`.${__classPrivateFieldGet(this,be,"f")}`],"f")}get theme(){return __classPrivateFieldGet(this,Se,"f")}setTheme(i){__classPrivateFieldSet(this,Se,mergeDeep(structuredClone(we),i||{}),"f")}get penStyleClasses(){return __classPrivateFieldGet(this,be,"f")}setPenStyleClasses(i=""){__classPrivateFieldSet(this,be,i,"f"),__classPrivateFieldSet(this,Ee,this.theme[`.${__classPrivateFieldGet(this,be,"f")}`],"f")}}xe=new WeakMap,Se=new WeakMap,be=new WeakMap,Ee=new WeakMap;const Ce={protocol:"WEBSOCKET",scheme:"https",host:"cloud.myscript.com",applicationKey:"",hmacKey:"",version:"2.1.0",useWindowLocation:!1,websocket:{pingEnabled:!0,pingDelay:3e4,maxPingLostCount:10,autoReconnect:!0,maxRetryCount:2,fileChunkSize:3e5}},ke={type:"TEXT",alwaysConnected:!0,lang:"en_US",gesture:{enable:!0},export:{"image-resolution":300,jiix:{"bounding-box":!1,strokes:!1,text:{chars:!1,words:!0}}},renderer:{debug:{"draw-text-boxes":!1,"draw-image-boxes":!1}},math:{mimeTypes:["application/vnd.myscript.jiix"],solver:{enable:!0,"fractional-part-digits":3,"decimal-separator":".","rounding-mode":"half up","angle-unit":"deg"},margin:{bottom:10,left:15,right:15,top:10},eraser:{"erase-precisely":!1},"undo-redo":{mode:"stroke"}},text:{guides:{enable:!0},mimeTypes:["application/vnd.myscript.jiix"],margin:{top:20,left:10,right:10,bottom:10},eraser:{"erase-precisely":!1}},diagram:{mimeTypes:["application/vnd.myscript.jiix"],eraser:{"erase-precisely":!1},convert:{"match-text-size":!0}},"raw-content":{recognition:{text:!0,shape:!0},eraser:{"erase-precisely":!1}}},Fe={listenerOptions:{capture:!1,passive:!0},xyFloatPrecision:0,timestampFloatPrecision:0},Me={minHeight:100,minWidth:100,smartGuide:{enable:!0,fadeOut:{enable:!1,duration:5e3}},guides:{enable:!0,gap:50}},Ge={exportContent:"POINTER_UP",exportContentDelay:1e3,resizeTriggerDelay:100},Te={processDelay:10},Le={maxStackSize:100},Ie={server:Ce,recognition:ke,grabber:Fe,rendering:Me,triggers:Ge,events:Te,"undo-redo":Le};class Configuration{constructor(i){this.events=JSON.parse(JSON.stringify(Ie.events)),this.grabber=JSON.parse(JSON.stringify(Ie.grabber)),this.recognition=JSON.parse(JSON.stringify(Ie.recognition)),this.rendering=JSON.parse(JSON.stringify(Ie.rendering)),this.server=JSON.parse(JSON.stringify(Ie.server)),this.triggers=JSON.parse(JSON.stringify(Ie.triggers)),this.overrideDefaultConfiguration(i)}overrideDefaultConfiguration(i){var n,s,a,l,d,c,h;const u=JSON.parse(JSON.stringify(Ie));this.events=mergeDeep({},u.events,null==i?void 0:i.events),this.grabber=mergeDeep({},u.grabber,null==i?void 0:i.grabber),this.recognition=mergeDeep({},u.recognition,null==i?void 0:i.recognition),this.rendering=mergeDeep({},u.rendering,null==i?void 0:i.rendering),this.server=mergeDeep({},u.server,null==i?void 0:i.server),this.triggers=mergeDeep({},u.triggers,null==i?void 0:i.triggers),this["undo-redo"]=mergeDeep({},u["undo-redo"],null==i?void 0:i["undo-redo"]),this.recognition.text.mimeTypes=(null===(s=null===(n=null==i?void 0:i.recognition)||void 0===n?void 0:n.text)||void 0===s?void 0:s.mimeTypes)||u.recognition.text.mimeTypes,this.recognition.math.mimeTypes=(null===(l=null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.math)||void 0===l?void 0:l.mimeTypes)||u.recognition.math.mimeTypes,this.recognition.diagram.mimeTypes=(null===(c=null===(d=null==i?void 0:i.recognition)||void 0===d?void 0:d.diagram)||void 0===c?void 0:c.mimeTypes)||u.recognition.diagram.mimeTypes,(null===(h=this.server)||void 0===h?void 0:h.useWindowLocation)&&(this.server.scheme=window.location.protocol.indexOf("s")>-1?"https":"http",this.server.host=window.location.host),"REST"===this.server.protocol&&"POINTER_UP"===this.triggers.exportContent&&(this.triggers.exportContent="QUIET_PERIOD",this.triggers.exportContentDelay=Math.max(this.triggers.exportContentDelay,50)),"WEBSOCKET"===this.server.protocol&&"TEXT"===this.recognition.type?this.rendering.smartGuide.enable&&!this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix")&&this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix"):this.rendering.smartGuide.enable=!1}}function computeDistance(i,n){const s=Math.hypot(n.y-i.y,n.x-i.x);return isNaN(s)?0:s}var Ae,De,Oe,Ne,Re,We,ze,je,He,Xe,Be,$e,Ue,Je,Ve,Ye,qe,Ze,Ke,Qe=Object.freeze({__proto__:null,computeDistance:computeDistance});class Model{constructor(i=100,n=100,s=Date.now()){Ae.add(this),this.creationTime=s,this.modificationDate=s,this.width=i,this.height=n,this.rawStrokes=[],this.selectedStrokes=[],this.positions={lastSentPosition:0,lastReceivedPosition:0},this.idle=!0}mergeExport(i){this.exports?Object.assign(this.exports,i):this.exports=i}mergeConvert(i){this.converts?Object.assign(this.converts,i):this.converts=i}computePressure(i,n){let s=1;0===n?s=.5:i===n?s=1:i<10?s=.2+Math.pow(.1*i,.4):i>n-10&&(s=.2+Math.pow(.1*(n-i),.4));const a=s*Math.max(.1,1-.1*Math.sqrt(i));return isNaN(a)?.5:Math.round(100*a)/100}filterPointByAcquisitionDelta(i,n,s){const a=2+(i.style["-myscript-pen-width"]||0)/4;return!s||0===i.pointers.length||Math.abs(s.x-n.x)>=a||Math.abs(s.y-n.y)>=a}addPoint(i,n){const s=i.pointers.at(-1)||{p:1,t:0,x:0,y:0};if(this.filterPointByAcquisitionDelta(i,n,s)){const a=computeDistance(n,s);i.length+=a,n.p=this.computePressure(a,i.length),i.pointers.push(n)}}addStroke(i){this.rawStrokes.push(i)}extractUnsentStrokes(){return this.rawStrokes.slice(this.positions.lastSentPosition)}initCurrentStroke(i,n,s,a,l=96){if(a["-myscript-pen-width"]){const i=a["-myscript-pen-width"]*l/25.4;a.width=i/2}this.modificationDate=Date.now(),this.exports=void 0,this.converts=void 0,this.currentStroke=new Stroke(a,n,s),this.addPoint(this.currentStroke,i)}appendToCurrentStroke(i){this.currentStroke&&this.addPoint(this.currentStroke,i)}endCurrentStroke(i){this.currentStroke&&(this.addPoint(this.currentStroke,i),this.addStroke(this.currentStroke),this.currentStroke=void 0)}resetSelectedStrokes(){this.selectedStrokes=[]}appendSelectedStrokesFromPoint(i){__classPrivateFieldGet(this,Ae,"m",De).call(this,i).forEach((i=>{this.selectedStrokes.includes(i)||this.selectedStrokes.push(i)}))}updateStroke(i){const n=this.rawStrokes.findIndex((n=>n.id===i.id));-1!==n&&this.rawStrokes.splice(n,1,i)}removeStroke(i){const n=this.rawStrokes.findIndex((n=>n.id===i));-1!==n&&this.rawStrokes.splice(n,1)}removeStrokesFromPoint(i){const n=__classPrivateFieldGet(this,Ae,"m",De).call(this,i);return n.forEach((i=>{this.removeStroke(i.id)})),n.map((i=>i.id))}updatePositionSent(i=this.rawStrokes.length){this.positions.lastSentPosition=i}updatePositionReceived(){this.positions.lastReceivedPosition=this.positions.lastSentPosition}getClone(){const i=new Model(this.width,this.height,this.creationTime);return i.modificationDate=JSON.parse(JSON.stringify(this.modificationDate)),i.currentStroke=this.currentStroke?JSON.parse(JSON.stringify(this.currentStroke)):void 0,i.rawStrokes=JSON.parse(JSON.stringify(this.rawStrokes)),i.positions=JSON.parse(JSON.stringify(this.positions)),i.exports=this.exports?JSON.parse(JSON.stringify(this.exports)):void 0,i.converts=this.converts?JSON.parse(JSON.stringify(this.converts)):void 0,i.idle=this.idle,i}clear(){this.modificationDate=Date.now(),this.currentStroke=void 0,this.rawStrokes=[],this.positions.lastSentPosition=0,this.positions.lastReceivedPosition=0,this.exports=void 0,this.converts=void 0,this.idle=!0}}Ae=new WeakSet,De=function _Model_getStrokeFromPoint(i){const isBetween=(i,n,s)=>i>=n&&i<=s,n=[];return this.rawStrokes.forEach((s=>{for(let a=0;a0&&(this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(this.model,i))).catch((i=>this.internalEvent.emitError(i))));else this.model.initCurrentStroke(n,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,n){if("erasing"===this.mode)this.model.removeStrokesFromPoint(n).length>0&&(this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ne,"f"),i))).catch((i=>this.internalEvent.emitError(i))));else this.model.appendToCurrentStroke(n),this.drawCurrentStroke()}onPointerUp(i,n){if("erasing"===this.mode)this.model.removeStrokesFromPoint(n).length>0&&(this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ne,"f"),i))).catch((i=>this.internalEvent.emitError(i))));else this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ne,"f"),i))).catch((i=>this.internalEvent.emitError(i)))}drawCurrentStroke(){this.renderer.drawPendingStroke(this.model.currentStroke)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){this.renderer.drawModel(this.model);const i=new DeferredPromise;if(this.undoRedoManager.addModelToStack(this.model),"DEMAND"!==__classPrivateFieldGet(this,Oe,"f").triggers.exportContent){clearTimeout(__classPrivateFieldGet(this,We,"f"));let n=this.model.getClone();__classPrivateFieldSet(this,We,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{n=yield this.recognizer.export(n),this.undoRedoManager.updateModelInStack(n),this.model.modificationDate===n.modificationDate&&(this.model.exports=n.exports),i.resolve(this.model)}catch(n){i.reject(n)}}))),"QUIET_PERIOD"===__classPrivateFieldGet(this,Oe,"f").triggers.exportContent?__classPrivateFieldGet(this,Oe,"f").triggers.exportContentDelay:0),"f")}else i.resolve(this.model);return yield i.promise,this.internalEvent.emitExported(this.model.exports),i.promise}))}export(i){return __awaiter(this,void 0,void 0,(function*(){const n=yield this.recognizer.export(this.model.getClone(),i);return this.model.modificationDate===n.modificationDate&&this.model.mergeExport(n.exports),this.undoRedoManager.updateModelInStack(n),this.model}))}convert(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=yield this.recognizer.convert(this.model,i,n);return Object.assign(__classPrivateFieldGet(this,Ne,"f"),s),this.model}))}resize(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=new DeferredPromise;this.model.height=i,this.model.width=n,this.renderer.resize(this.model),this.model.rawStrokes.length?(clearTimeout(__classPrivateFieldGet(this,Re,"f")),__classPrivateFieldSet(this,Re,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){const i=yield this.recognizer.resize(this.model);s.resolve(i)}))),__classPrivateFieldGet(this,Oe,"f").triggers.resizeTriggerDelay),"f")):s.resolve(this.model);const a=yield s.promise;return this.internalEvent.emitExported(a.exports),a}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldSet(this,Ne,this.undoRedoManager.undo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,Ne,"f")),__classPrivateFieldSet(this,Ne,yield this.recognizer.export(__classPrivateFieldGet(this,Ne,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,Ne,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,Ne,"f").exports),__classPrivateFieldGet(this,Ne,"f")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldSet(this,Ne,this.undoRedoManager.redo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,Ne,"f")),__classPrivateFieldSet(this,Ne,yield this.recognizer.export(__classPrivateFieldGet(this,Ne,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,Ne,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,Ne,"f").exports),__classPrivateFieldGet(this,Ne,"f")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.renderer.drawModel(this.model),this.internalEvent.emitExported(this.model.exports),this.model}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return this.grabber.detach(),this.renderer.destroy(),Promise.resolve()}))}}Oe=new WeakMap,Ne=new WeakMap,Re=new WeakMap,We=new WeakMap;class WSRecognizer{constructor(i,n){this.pingCount=0,this.reconnectionCount=0,this.serverConfiguration=i,this.recognitionConfiguration=n;const s="https"===this.serverConfiguration.scheme?"wss":"ws";this.url=`${s}://${this.serverConfiguration.host}/api/v4.0/iink/document?applicationKey=${this.serverConfiguration.applicationKey}`}get mimeTypes(){switch(this.recognitionConfiguration.type.toLocaleLowerCase()){case"text":return this.recognitionConfiguration.text.mimeTypes;case"math":return this.recognitionConfiguration.math.mimeTypes;case"diagram":return this.recognitionConfiguration.diagram.mimeTypes;default:return[]}}get internalEvent(){return InternalEvent.getInstance()}infinitePing(){this.pingCount++,this.serverConfiguration.websocket.maxPingLostCount{this.socket.readyState<=1&&(this.socket.send(JSON.stringify({type:"ping"})),this.infinitePing())}),this.serverConfiguration.websocket.pingDelay)}openCallback(){var i;null===(i=this.connected)||void 0===i||i.resolve();const n={type:this.sessionId?"restoreIInkSession":"newContentPackage",iinkSessionId:this.sessionId,applicationKey:this.serverConfiguration.applicationKey,xDpi:96,yDpi:96,viewSizeHeight:this.viewSizeHeight,viewSizeWidth:this.viewSizeWidth};isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(n["myscript-client-name"]="iink-ts",n["myscript-client-version"]="1.0.0-buildVersion"),this.send(n)}rejectDeferredPending(i){var n,s,a,l,d,c,h,u,p,v,m,g,_,f,y,P,w,x,S,b;(null===(n=this.connected)||void 0===n?void 0:n.isPending)&&(null===(s=this.connected)||void 0===s||s.reject(i)),(null===(a=this.initialized)||void 0===a?void 0:a.isPending)&&(null===(l=this.initialized)||void 0===l||l.reject(i)),(null===(d=this.addStrokeDeferred)||void 0===d?void 0:d.isPending)&&(null===(c=this.addStrokeDeferred)||void 0===c||c.reject(i)),(null===(h=this.exportDeferred)||void 0===h?void 0:h.isPending)&&(null===(u=this.exportDeferred)||void 0===u||u.reject(i)),(null===(p=this.convertDeferred)||void 0===p?void 0:p.isPending)&&(null===(v=this.convertDeferred)||void 0===v||v.reject(i)),(null===(m=this.importDeferred)||void 0===m?void 0:m.isPending)&&(null===(g=this.importDeferred)||void 0===g||g.reject(i)),(null===(_=this.resizeDeferred)||void 0===_?void 0:_.isPending)&&(null===(f=this.resizeDeferred)||void 0===f||f.reject(i)),(null===(y=this.undoDeferred)||void 0===y?void 0:y.isPending)&&(null===(P=this.undoDeferred)||void 0===P||P.reject(i)),(null===(w=this.redoDeferred)||void 0===w?void 0:w.isPending)&&(null===(x=this.redoDeferred)||void 0===x||x.reject(i)),(null===(S=this.clearDeferred)||void 0===S?void 0:S.isPending)&&this.clearDeferred.reject(i),(null===(b=this.waitForIdleDeferred)||void 0===b?void 0:b.isPending)&&this.waitForIdleDeferred.reject(i)}closeCallback(n){let s="";if(!this.currentErrorCode)switch(n.code){case 1e3:break;case 1001:s=i.GOING_AWAY;break;case 1002:s=i.PROTOCOL_ERROR;break;case 1003:s=i.UNSUPPORTED_DATA;break;case 1006:s=i.ABNORMAL_CLOSURE;break;case 1007:s=i.INVALID_FRAME_PAULOAD;break;case 1008:s=i.POLICY_VIOLATION;break;case 1009:s=i.MESSAGE_TOO_BIG;break;case 1011:s=i.INTERNAL_ERROR;break;case 1012:s=i.SERVICE_RESTART;break;case 1013:s=i.TRY_AGAIN;break;case 1014:s=i.BAD_GATEWAY;break;case 1015:s=i.TLS_HANDSHAKE;break;default:s=i.CANT_ESTABLISH}const a=new Error(s||n.reason);this.rejectDeferredPending(a),this.currentErrorCode||1e3===n.code||this.internalEvent.emitError(a)}manageHMACChallengeMessage(i){const n=i;n.hmacChallenge&&this.send({type:"hmac",hmac:computeHmac(n.hmacChallenge,this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)}),n.iinkSessionId&&(this.sessionId=n.iinkSessionId)}manageContentPackageDescriptionMessage(){this.reconnectionCount=0,this.send(Object.assign(Object.assign({},this.recognitionConfiguration),{type:"configuration"})),this.currentPartId?this.send({type:"openContentPart",id:this.currentPartId,mimeTypes:this.mimeTypes}):this.send({type:"newContentPart",contentType:this.recognitionConfiguration.type,mimeTypes:this.mimeTypes})}managePartChangeMessage(i){var n;const s=i;this.currentPartId=s.partId,null===(n=this.initialized)||void 0===n||n.resolve()}manageExportMessage(i){var n,s,a,l,d,c,h,u,p;const v=i;v.exports["application/vnd.myscript.jiix"]&&(v.exports["application/vnd.myscript.jiix"]=JSON.parse(v.exports["application/vnd.myscript.jiix"].toString())),null===(n=this.initialized)||void 0===n||n.resolve(),null===(s=this.addStrokeDeferred)||void 0===s||s.resolve(v.exports),null===(a=this.exportDeferred)||void 0===a||a.resolve(v.exports),null===(l=this.convertDeferred)||void 0===l||l.resolve(v.exports),null===(d=this.importDeferred)||void 0===d||d.resolve(v.exports),null===(c=this.undoDeferred)||void 0===c||c.resolve(v.exports),null===(h=this.redoDeferred)||void 0===h||h.resolve(v.exports),null===(u=this.clearDeferred)||void 0===u||u.resolve(v.exports),null===(p=this.importPointEventsDeferred)||void 0===p||p.resolve(v.exports),this.internalEvent.emitExported(v.exports)}manageWaitForIdle(){var i;return __awaiter(this,void 0,void 0,(function*(){this.internalEvent.emitIdle(!0),null===(i=this.waitForIdleDeferred)||void 0===i||i.resolve()}))}manageErrorMessage(n){var s,a;const l=n;this.currentErrorCode=(null===(s=l.data)||void 0===s?void 0:s.code)||l.code;let d=(null===(a=l.data)||void 0===a?void 0:a.message)||l.message||i.UNKNOW;switch(this.currentErrorCode){case"no.activity":d=i.NO_ACTIVITY;break;case"access.not.granted":d=i.WRONG_CREDENTIALS;break;case"session.too.old":d=i.TOO_OLD}const c=new Error(d);this.rejectDeferredPending(c),this.internalEvent.emitError(c)}manageContentChangeMessage(i){const n=i,s={canRedo:n.canRedo,canUndo:n.canUndo,empty:n.empty,stackIndex:n.undoStackIndex,possibleUndoCount:n.possibleUndoCount,stack:[]};this.internalEvent.emitContextChange(s)}manageSVGPatchMessage(i){var n;null===(n=this.resizeDeferred)||void 0===n||n.resolve();const s=i;this.internalEvent.emitSVGPatch(s)}messageCallback(i){var n;this.currentErrorCode=void 0;const s=JSON.parse(i.data);if("pong"!==s.type)switch(this.pingCount=0,s.type){case"ack":this.manageHMACChallengeMessage(s);break;case"contentPackageDescription":this.manageContentPackageDescriptionMessage();break;case"partChanged":this.managePartChangeMessage(s);break;case"newPart":null===(n=this.initialized)||void 0===n||n.resolve();break;case"contentChanged":this.manageContentChangeMessage(s);break;case"exported":this.manageExportMessage(s);break;case"svgPatch":this.manageSVGPatchMessage(s);break;case"error":this.manageErrorMessage(s);break;case"idle":this.manageWaitForIdle()}}init(n,s){var a,l;return __awaiter(this,void 0,void 0,(function*(){try{return this.destroy(),this.connected=new DeferredPromise,this.initialized=new DeferredPromise,this.viewSizeHeight=n,this.viewSizeWidth=s,this.pingCount=0,this.socket=new WebSocket(this.url),this.serverConfiguration.websocket.pingEnabled&&this.infinitePing(),this.socket.addEventListener("open",this.openCallback.bind(this)),this.socket.addEventListener("close",this.closeCallback.bind(this)),this.socket.addEventListener("message",this.messageCallback.bind(this)),this.initialized.promise}catch(n){const s=new Error(i.CANT_ESTABLISH);return this.internalEvent.emitError(s),null===(a=this.initialized)||void 0===a||a.reject(s),null===(l=this.initialized)||void 0===l?void 0:l.promise}}))}send(i){return __awaiter(this,void 0,void 0,(function*(){return this.connected?(yield this.connected.promise,this.socket.readyState===this.socket.OPEN?(this.socket.send(JSON.stringify(i)),Promise.resolve()):this.socket.readyState!=this.socket.CONNECTING&&this.serverConfiguration.websocket.autoReconnect?(this.reconnectionCount++,this.serverConfiguration.websocket.maxRetryCount>=this.reconnectionCount?(this.internalEvent.emitClearMessage(),yield this.init(this.viewSizeHeight,this.viewSizeWidth),this.setPenStyle(this.penStyle),this.setPenStyleClasses(this.penStyleClasses),this.setTheme(this.theme),this.send(i)):Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached."))):void 0):Promise.reject(new Error("Recognizer must be initilized"))}))}addStrokes(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.addStrokeDeferred=new DeferredPromise;const a=i.extractUnsentStrokes();i.updatePositionSent();const l=i.getClone();if(0===a.length)return this.addStrokeDeferred.resolve({}),l;yield this.send({type:"addStrokes",strokes:a.map(convertStrokeToJSON)});const d=yield null===(s=this.addStrokeDeferred)||void 0===s?void 0:s.promise;return l.updatePositionReceived(),l.mergeExport(d),l}))}setPenStyle(i){var n;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.penStyle=i;const s={type:"setPenStyle",style:me.penStyleToCSS(i)};return this.send(s)}))}setPenStyleClasses(i){var n;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.penStyleClasses=i;const s={type:"setPenStyleClasses",styleClasses:i};return this.send(s)}))}setTheme(i){var n;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.theme=i;const s={type:"setTheme",theme:me.themeToCSS(i)};return this.send(s)}))}export(i,n){var s,a;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.exportDeferred=new DeferredPromise;const l=i.getClone();let d=n||[];if(!d.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":d=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":d=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":d=["application/vnd.myscript.jiix"];break;case"TEXT":d=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}if(!d.length)return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${this.recognitionConfiguration.type} configuration`));const c={type:"export",partId:this.currentPartId,mimeTypes:d};yield this.send(c);const h=yield null===(a=this.exportDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeExport(h),l}))}import(i,n,s){var a,l;return __awaiter(this,void 0,void 0,(function*(){yield null===(a=this.initialized)||void 0===a?void 0:a.promise;const d=i.getClone(),c=this.serverConfiguration.websocket.fileChunkSize,h=Math.random().toString(10).substring(2,6);this.importDeferred=new DeferredPromise;const readBlob=i=>{const n=new FileReader;return new Promise(((s,a)=>{n.onloadend=i=>{var n;return s(null===(n=i.target)||void 0===n?void 0:n.result)},n.onerror=()=>a(),n.readAsText(i)}))},u={type:"importFile",importFileId:h,mimeType:s};yield this.send(u);for(let i=0;in.size};yield this.send(a)}const p=yield null===(l=this.importDeferred)||void 0===l?void 0:l.promise;return this.importDeferred=void 0,d.mergeExport(p),d}))}resize(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.resizeDeferred=new DeferredPromise;const a=i.getClone();this.viewSizeHeight=a.height,this.viewSizeWidth=a.width;const l={type:"changeViewSize",height:this.viewSizeHeight,width:this.viewSizeWidth};return yield this.send(l),yield null===(s=this.resizeDeferred)||void 0===s?void 0:s.promise,a}))}importPointEvents(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.importPointEventsDeferred=new DeferredPromise;const a={type:"pointerEvents",events:i.map(convertStrokeToJSON)};this.send(a);const l=yield null===(s=this.importPointEventsDeferred)||void 0===s?void 0:s.promise;return this.importPointEventsDeferred=void 0,l}))}convert(i,n){var s,a;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.convertDeferred=new DeferredPromise;const l=i.getClone(),d={type:"convert",conversionState:n};yield this.send(d);const c=yield null===(a=this.convertDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeConvert(c),l.mergeExport(c),l}))}waitForIdle(){var i,n;return __awaiter(this,void 0,void 0,(function*(){yield null===(i=this.initialized)||void 0===i?void 0:i.promise,this.waitForIdleDeferred=new DeferredPromise;return yield this.send({type:"waitForIdle"}),null===(n=this.waitForIdleDeferred)||void 0===n?void 0:n.promise}))}undo(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise;const a=i.getClone();this.undoDeferred=new DeferredPromise;yield this.send({type:"undo"});const l=yield null===(s=this.undoDeferred)||void 0===s?void 0:s.promise;return a.updatePositionReceived(),a.mergeExport(l),this.undoDeferred=void 0,a}))}redo(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise;const a=i.getClone();this.redoDeferred=new DeferredPromise;yield this.send({type:"redo"});const l=yield null===(s=this.redoDeferred)||void 0===s?void 0:s.promise;return a.updatePositionReceived(),a.mergeExport(l),this.redoDeferred=void 0,a}))}clear(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise;const a=i.getClone();a.modificationDate=Date.now(),this.clearDeferred=new DeferredPromise;yield this.send({type:"clear"});const l=yield null===(s=this.clearDeferred)||void 0===s?void 0:s.promise;return a.updatePositionReceived(),a.mergeExport(l),this.clearDeferred=void 0,a}))}close(i,n){this.socket.readyState!==this.socket.OPEN&&this.socket.readyState!==this.socket.CONNECTING||(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.socket.close(i,n))}destroy(){this.connected=void 0,this.initialized=void 0,this.addStrokeDeferred=void 0,this.exportDeferred=void 0,this.convertDeferred=void 0,this.importDeferred=void 0,this.resizeDeferred=void 0,this.undoDeferred=void 0,this.redoDeferred=void 0,this.clearDeferred=void 0,this.socket&&(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.close(1e3,"Recognizer destroyed"))}}class SVGStroker{getArcPath(i,n){return[`M ${i.x},${i.y}`,`m ${-n},0`,`a ${n},${n} 0 1 0 ${2*n},0`,`a ${n},${n} 0 1 0 ${-2*n},0`].join(" ")}getLinePath(i,n,s){const a=computeLinksPoints(i,computeAxeAngle(i,n),s),l=computeLinksPoints(n,computeAxeAngle(i,n),s);return[`M ${a[0].x},${a[0].y}`,`L ${l[0].x},${l[0].y}`,`L ${l[1].x},${l[1].y}`,`L ${a[1].x},${a[1].y}`].join(" ")}getFinalPath(i,n,s){const a=computeAxeAngle(i,n),l=computeLinksPoints(n,a,s),d=[`M ${l[0].x},${l[0].y}`];for(let i=1;i<=6;i++){const l=a-i*(Math.PI/6);d.push(`L ${n.x-n.p*s*Math.sin(l)},${n.y+n.p*s*Math.cos(l)}`)}return d.join(" ")}getQuadraticPath(i,n,s,a){const l=computeLinksPoints(i,computeAxeAngle(i,s),a),d=computeLinksPoints(n,computeAxeAngle(s,n),a),c=computeLinksPoints(s,computeAxeAngle(i,n),a);return[`M ${l[0].x},${l[0].y}`,`Q ${c[0].x},${c[0].y} ${d[0].x},${d[0].y}`,`L ${d[1].x},${d[1].y}`,`Q ${c[1].x},${c[1].y} ${l[1].x},${l[1].y}`].join(" ")}buildSVGPath(i){const n=i.pointers.length,s=i.style.width,a=n-2,l=i.pointers[0],d=[];if(n<3)d.push(this.getArcPath(l,.6*s));else{d.push(this.getArcPath(l,s*l.p)),d.push(this.getLinePath(l,computeMiddlePoint(l,i.pointers[1]),s));for(let n=0;n{a.setAttribute(i.name,i.value)}));const l=this.buildSVGPath(n);a.setAttribute("d",`${l}Z`),i.appendChild(a)}}class WSSVGRenderer{constructor(i){ze.add(this),this.config=i,this.stroker=new SVGStroker}init(i){i.style.fontSize="10px",this.context={parent:i}}updateLayer(i,n){switch(n.type){case"REPLACE_ALL":__classPrivateFieldGet(this,ze,"m",He).call(this,i,n);break;case"REPLACE_ELEMENT":__classPrivateFieldGet(this,ze,"m",Xe).call(this,n);break;case"APPEND_CHILD":__classPrivateFieldGet(this,ze,"m",Be).call(this,i,n);break;case"REMOVE_ELEMENT":__classPrivateFieldGet(this,ze,"m",Ue).call(this,n);break;case"REMOVE_CHILD":__classPrivateFieldGet(this,ze,"m",$e).call(this,n);break;case"INSERT_BEFORE":__classPrivateFieldGet(this,ze,"m",Je).call(this,n);break;case"SET_ATTRIBUTE":__classPrivateFieldGet(this,ze,"m",Ve).call(this,n);break;case"REMOVE_ATTRIBUTE":__classPrivateFieldGet(this,ze,"m",Ye).call(this,n)}}updatesLayer(i,n){n.forEach((n=>this.updateLayer(i,n))),this.clearPendingStroke()}clearPendingStroke(){const i=this.context.parent.querySelector("#pendingStrokes");i&&(i.innerHTML="")}drawPendingStroke(i){if(i){const n=this.context.parent.querySelector("#pendingStrokes");if(n){const s=n.querySelector(`#${null==i?void 0:i.id}`);s&&s.remove(),__classPrivateFieldGet(this,ze,"m",je).call(this,n,i)}}}resize(i){const n=this.context.parent.getBoundingClientRect(),s=this.context.parent.querySelectorAll("svg"),a=Math.max(n.width,i.width),l=Math.max(n.height,i.height);s.forEach((i=>{i.setAttribute("viewBox",`0 0 ${a}, ${l}`),i.setAttribute("width",`${a}px`),i.setAttribute("height",`${l}px`)}))}destroy(){this.context.parent&&this.context.parent.querySelectorAll("svg").forEach((i=>i.remove()))}}ze=new WeakSet,je=function _WSSVGRenderer_drawStroke(i,n){let s;"eraser"===n.pointerType?(n.style.width=20,s="fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;"):s=`fill:${n.style.color};stroke:transparent;`,this.stroker.drawStroke(i,n,[{name:"style",value:s}])},He=function _WSSVGRenderer_replaceAll(i,n){const s=this.context.parent.querySelector(`svg[data-layer="${i}"]`);null==s||s.remove(),this.context.parent.insertAdjacentHTML("beforeend",n.svg);const a=this.context.parent.querySelector(`svg[data-layer="${i}"]`);if("MODEL"===i){const i=document.createElementNS("http://www.w3.org/2000/svg","g");i.id="pendingStrokes",a.appendChild(i)}},Xe=function _WSSVGRenderer_replaceElement(i){const n=this.context.parent.querySelector(`#${i.id}`);if(n){const s=n.parentNode;null==n||n.remove(),null==s||s.insertAdjacentHTML("beforeend",i.svg)}},Be=function _WSSVGRenderer_appendChild(i,n){const s=n.parentId?`#${n.parentId}`:`svg[data-layer="${i}"]`,a=this.context.parent.querySelector(s);null==a||a.insertAdjacentHTML("beforeend",n.svg)},$e=function _WSSVGRenderer_removeChild(i){var n;null===(n=this.context.parent.querySelector(`#${i.parentId} > *:nth-child(${i.index+1})`))||void 0===n||n.remove()},Ue=function _WSSVGRenderer_removeElement(i){const n=this.context.parent.querySelector(`#${i.id}`);n&&(i.id.includes("s")||i.id.includes("MODEL")?n.remove():(n.setAttribute("class","removed-stroke"),setTimeout((()=>{null==n||n.remove()}),100)))},Je=function _WSSVGRenderer_insertBefore(i){const n=this.context.parent.querySelector(`#${i.refId}`);null==n||n.insertAdjacentHTML("beforebegin",i.svg)},Ve=function _WSSVGRenderer_setAttribute(i){const n=i.id?`#${i.id}`:"svg",s=this.context.parent.querySelector(n);null==s||s.setAttribute(i.name,i.value)},Ye=function _WSSVGRenderer_removeAttribute(i){const n=i.id?`#${i.id}`:"svg",s=this.context.parent.querySelector(n);null==s||s.removeAttribute(i.name)};class WSBehaviors{constructor(i){this.name="WSBehaviors",qe.set(this,void 0),Ze.set(this,void 0),Ke.set(this,void 0),this.onSVGPatch=i=>{this.renderer.updatesLayer(i.layer,i.updates)},this.onContextChange=i=>{this.context.canRedo=i.canRedo,this.context.canUndo=i.canUndo,this.context.empty=i.empty,this.context.possibleUndoCount=i.possibleUndoCount,this.context.stackIndex=i.stackIndex},this.options=i,__classPrivateFieldSet(this,qe,new Configuration(null==i?void 0:i.configuration),"f"),this.styleManager=new StyleManager(i.penStyle,i.theme),this.grabber=new PointerEventGrabber(__classPrivateFieldGet(this,qe,"f").grabber),this.renderer=new WSSVGRenderer(__classPrivateFieldGet(this,qe,"f").rendering),this.recognizer=new WSRecognizer(__classPrivateFieldGet(this,qe,"f").server,__classPrivateFieldGet(this,qe,"f").recognition),this.mode="writing",__classPrivateFieldSet(this,Ze,new Model,"f"),this.context={canRedo:!1,canUndo:!1,empty:!0,stackIndex:-1,possibleUndoCount:0,stack:[]}}get internalEvent(){return InternalEvent.getInstance()}get model(){return __classPrivateFieldGet(this,Ze,"f")}get configuration(){return __classPrivateFieldGet(this,qe,"f")}get currentPenStyle(){return this.styleManager.currentPenStyle}get penStyle(){return this.styleManager.penStyle}setPenStyle(i){return this.styleManager.setPenStyle(i),this.recognizer.setPenStyle(this.styleManager.penStyle)}get penStyleClasses(){return this.styleManager.penStyleClasses}setPenStyleClasses(i){return this.styleManager.setPenStyleClasses(i),this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)}get theme(){return this.styleManager.theme}setTheme(i){return this.styleManager.setTheme(i),this.recognizer.setTheme(this.styleManager.theme)}init(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ze,"f").width=Math.max(i.clientWidth,__classPrivateFieldGet(this,qe,"f").rendering.minWidth),__classPrivateFieldGet(this,Ze,"f").height=Math.max(i.clientHeight,__classPrivateFieldGet(this,qe,"f").rendering.minHeight),this.context.stack.push(this.model.getClone()),this.context.stackIndex=0,this.renderer.init(i),this.grabber.attach(i),this.grabber.onPointerDown=this.onPointerDown.bind(this),this.grabber.onPointerMove=this.onPointerMove.bind(this),this.grabber.onPointerUp=this.onPointerUp.bind(this),this.internalEvent.addSVGPatchListener(this.onSVGPatch),this.internalEvent.addContextChangeListener(this.onContextChange),yield this.recognizer.init(__classPrivateFieldGet(this,Ze,"f").height,__classPrivateFieldGet(this,Ze,"f").width),yield this.setPenStyle(this.penStyle),yield this.setTheme(this.theme),yield this.setPenStyleClasses(this.penStyleClasses)}))}onPointerDown(i,n){var s;let{pointerType:a}=i;const l=Object.assign({},null===(s=this.theme)||void 0===s?void 0:s.ink,this.currentPenStyle);"erasing"===this.mode&&(a="eraser"),this.model.initCurrentStroke(n,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,n){this.model.appendToCurrentStroke(n),this.drawCurrentStroke()}onPointerUp(i,n){this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ze,"f"),i))).catch((i=>this.internalEvent.emitError(i)))}drawCurrentStroke(){const i=this.model.currentStroke;i&&this.renderer.drawPendingStroke(i)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){if(this.context.stack.push(this.model.getClone()),"DEMAND"!==__classPrivateFieldGet(this,qe,"f").triggers.exportContent){const i=yield this.recognizer.addStrokes(this.model);this.model.mergeExport(i.exports)}return this.model}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){return this.recognizer.waitForIdle()}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){const n=yield this.recognizer.importPointEvents(i);return this.model.mergeExport(n),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){try{return"DEMAND"===__classPrivateFieldGet(this,qe,"f").triggers.exportContent?this.recognizer.addStrokes(this.model):this.recognizer.export(this.model,i)}catch(i){return this.internalEvent.emitError(i),Promise.reject(i)}}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return this.context.stack.push(this.model.getClone()),__classPrivateFieldSet(this,Ze,yield this.recognizer.convert(this.model,i),"f"),this.model}))}import(i,n){return __awaiter(this,void 0,void 0,(function*(){return this.context.stack.push(this.model.getClone()),this.recognizer.import(this.model,i,n)}))}resize(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=new DeferredPromise;this.model.height=i,this.model.width=n;const a=this.model.getClone();return this.renderer.resize(a),clearTimeout(__classPrivateFieldGet(this,Ke,"f")),__classPrivateFieldSet(this,Ke,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{const i=yield this.recognizer.resize(a);s.resolve(i)}catch(i){s.reject(i)}}))),__classPrivateFieldGet(this,qe,"f").triggers.resizeTriggerDelay),"f"),__classPrivateFieldSet(this,Ze,yield s.promise,"f"),this.internalEvent.emitExported(this.model.exports),this.model}))}undo(){return __awaiter(this,void 0,void 0,(function*(){if(this.context.canUndo)return __classPrivateFieldSet(this,Ze,this.context.stack[this.context.stackIndex-1],"f"),this.recognizer.undo(__classPrivateFieldGet(this,Ze,"f"));throw new Error("Undo not allowed")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){if(this.context.canRedo)return __classPrivateFieldSet(this,Ze,this.context.stack[this.context.stackIndex+1],"f"),this.recognizer.redo(__classPrivateFieldGet(this,Ze,"f"));throw new Error("Redo not allowed")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.model.clear(),this.context.stack.push(this.model.getClone()),this.recognizer.clear(this.model)}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return this.grabber.detach(),this.renderer.destroy(),this.recognizer.close(1e3,a.CLOSE_RECOGNIZER),Promise.resolve()}))}}qe=new WeakMap,Ze=new WeakMap,Ke=new WeakMap;var et,tt,it,nt,st,rt,ot,at,lt,dt,ct,ht,ut,pt,vt,mt,gt,_t;!function styleInject(i,n){void 0===n&&(n={});var s=n.insertAt;if(i&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===s&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=i:l.appendChild(document.createTextNode(i))}}('.ms-editor {\n position: relative;\n z-index: 10;\n color: #1A9FFF;\n font-family: sans-serif;\n}\n\n.ms-editor.erasing {\n cursor: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=\') 10 10, auto;\n}\n\n.ms-editor canvas,\n.ms-editor svg {\n z-index: 20;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n\n.ms-editor canvas.ms-rendering-canvas {\n z-index: 9;\n pointer-events: none;\n background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px);\n background-size: 18px 18px;\n}\n\n.ms-editor .loader {\n z-index: 30;\n position: absolute;\n width: 120px;\n height: 120px;\n top: calc(50% - 60px);\n left: calc(50% - 60px);\n border: 16px solid #F5F6F7;\n border-radius: 50%;\n border-top-color: #1A9FFF;\n -webkit-animation: spin 2s linear infinite;\n animation: spin 2s linear infinite;\n}\n\n.ms-editor .message {\n z-index: 25;\n position: absolute;\n width: 300px;\n max-height: calc(25%);\n min-height: 200px;\n top: calc(50% - 100px);\n left: calc(50% - 150px);\n font-size: 16px;\n text-align: center;\n word-wrap: break-word;\n}\n\n.ms-editor .message.error-msg::before {\n content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo=");\n}\n\n.ms-editor .message.info-msg::before {\n content: "";\n background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");;\n background-size: 100% 100%;\n display: block;\n margin: auto;\n padding-bottom: 10px;\n height: 25px;\n width: 25px;\n}\n\n.ms-editor .smartguide {\n position: absolute;\n z-index: 40;\n font-size: 16px;\n height: 48px;\n line-height: 48px;\n}\n\n.ms-editor .smartguide.smartguide-in {\n visibility: visible !important;\n transition: opacity 0.5s;\n opacity: 1;\n}\n\n.ms-editor .smartguide.smartguide-out {\n transition: opacity 1s, visibility 1s;\n visibility: hidden !important;\n opacity: 0;\n}\n\n.ms-editor .smartguide .tag-icon {\n padding: 0 18px;\n border: 1px solid #959DA6;\n font-weight: bold;\n font-size: large;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n z-index: 31;\n height: 100%;\n line-height: 48px;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n}\n\n.ms-editor .smartguide .ellipsis {\n cursor: pointer;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 31;\n height: 48px;\n line-height: 38px;\n padding: 0 8px;\n font-weight: bold;\n font-size: x-large;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .ellipsis:active {\n background-color: #e0e0e0;\n}\n\n.ms-editor .smartguide .prompter-container {\n background-color: rgba(255, 255, 255, 0.9);\n height: 48px;\n line-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n text-align: left;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 30;\n color: #bfbfbf;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .prompter-container > div > span {\n cursor: pointer;\n display: inline-block;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text {\n margin-left: 12px;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .added-word {\n animation: 0.1s linear word-added,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .modified-word {\n animation: 0.1s linear word-modified,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .candidates {\n color: black;\n flex-direction: column;\n text-align: center;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n z-index: 100;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .candidates > span {\n cursor: pointer;\n padding: 2px 20px;\n}\n\n.ms-editor .smartguide .candidates > span:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .candidates > span:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .candidates .selected-word {\n font-weight: bold;\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .more-menu {\n display: flex;\n flex-direction: column;\n margin-right: 12px;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n z-index: 100;\n box-shadow: 2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n overflow: hidden;\n transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear;\n}\n.ms-editor .smartguide .more-menu.open {\n max-height: 500px;\n visibility: visible;\n opacity: 1;\n}\n.ms-editor .smartguide .more-menu.close {\n max-height: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button {\n color: black;\n font-size: 16px;\n cursor: pointer;\n box-sizing: border-box;\n background: transparent;\n border: none;\n padding: 0 24px;\n margin: 0;\n height: 40px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .ps__rail-x {\n top: 32px !important;\n}\n\n.ms-editor #stroke-panel {\n position: fixed;\n bottom: 10px;\n left: 10px;\n right: 10px;\n background-color: white;\n border: solid black 2px;\n padding: 5px;\n word-wrap: break-word;\n overflow: auto;\n cursor: copy;\n max-height: 100px;\n z-index: 999;\n}\n\n/** Stroke **/\n\n.ms-editor .removed-stroke {\n opacity: 0;\n transition: opacity 0.1s ease-in-out;\n}\n\n.ms-editor .added-stroke {\n animation: 0.2s opacity-appear;\n}\n\n@keyframes color-input {\n 0% {\n color: black;\n }\n 100% {\n color: #bfbfbf;\n }\n}\n\n@keyframes word-added {\n 0% {\n transform: translate(5px, 0);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes word-modified {\n 0% {\n transform: translate(0, 5px);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes opacity-appear {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity : 1;\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n');class Editor{constructor(i,n,s="ms-editor"){et.add(this),tt.set(this,void 0),it.set(this,void 0),nt.set(this,void 0),st.set(this,void 0),rt.set(this,void 0),this.debug=!1,vt.set(this,(i=>{this.events.emitChanged(i)})),mt.set(this,(i=>{this.events.emitIdle(i)})),__classPrivateFieldSet(this,rt,new DeferredPromise,"f"),this.wrapperHTML=i,this.wrapperHTML.classList.add(s),this.events.setElement(this.wrapperHTML),__classPrivateFieldSet(this,tt,document.createElement("div"),"f"),__classPrivateFieldGet(this,tt,"f").classList.add("loader"),__classPrivateFieldGet(this,tt,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,tt,"f")),__classPrivateFieldSet(this,it,document.createElement("div"),"f"),__classPrivateFieldGet(this,it,"f").classList.add("message"),__classPrivateFieldGet(this,it,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,it,"f")),__classPrivateFieldGet(this,et,"m",ot).call(this,n),__classPrivateFieldGet(this,et,"m",pt).call(this)}get initializationPromise(){return __classPrivateFieldGet(this,rt,"f").promise}get model(){return this.behaviors.model}get behaviors(){return __classPrivateFieldGet(this,nt,"f")}get configuration(){return this.behaviors.configuration}set configuration(i){__classPrivateFieldGet(this,et,"m",ot).call(this,{configuration:i}),this.initialize()}get mode(){return this.behaviors.mode}set mode(i){if(this.behaviors.mode=i,"erasing"===this.behaviors.mode)this.wrapperHTML.classList.add("erasing"),this.wrapperHTML.classList.remove("selecting");else document.body.style.cursor="initial",this.wrapperHTML.classList.remove("erasing"),this.wrapperHTML.classList.remove("selecting")}get events(){return PublicEvent.getInstance()}get context(){return this.behaviors.context}get grabber(){return this.behaviors.grabber}get currentPenStyle(){return this.behaviors.currentPenStyle}get penStyle(){return this.behaviors.penStyle}set penStyle(i){this.behaviors.setPenStyle(i)}get theme(){return this.behaviors.theme}set theme(i){this.behaviors.setTheme(i)}get penStyleClasses(){return this.behaviors.penStyleClasses}set penStyleClasses(i){this.behaviors.setPenStyleClasses(i)}initialize(){return __awaiter(this,void 0,void 0,(function*(){yield __classPrivateFieldGet(this,et,"m",at).call(this),__classPrivateFieldGet(this,et,"m",lt).call(this)}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){if(this.behaviors.waitForIdle)return this.behaviors.waitForIdle()}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,rt,"f").promise,yield this.behaviors.undo(),__classPrivateFieldGet(this,et,"m",ut).call(this),this.model}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,rt,"f").promise,yield this.behaviors.redo(),__classPrivateFieldGet(this,et,"m",ut).call(this),this.model}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,rt,"f").promise,yield this.behaviors.clear(),this.events.emitCleared(this.model),__classPrivateFieldGet(this,et,"m",ut).call(this),this.model}))}resize(){var i;return __awaiter(this,void 0,void 0,(function*(){yield __classPrivateFieldGet(this,rt,"f").promise,this.configuration.rendering.smartGuide.enable&&(null===(i=__classPrivateFieldGet(this,st,"f"))||void 0===i||i.resize());const n=Math.max(this.wrapperHTML.clientHeight,this.configuration.rendering.minHeight),s=Math.max(this.wrapperHTML.clientWidth,this.configuration.rendering.minWidth);return yield this.behaviors.resize(n,s),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,rt,"f").promise,yield this.behaviors.export(i),this.model}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,rt,"f").promise,yield this.behaviors.convert(null==i?void 0:i.conversionState,null==i?void 0:i.mimeTypes),this.events.emitConverted(this.model.converts),this.model}))}import(i,n){return __awaiter(this,void 0,void 0,(function*(){if(yield __classPrivateFieldGet(this,rt,"f").promise,this.behaviors.import){let s;return s=i instanceof Blob?i:"string"==typeof i?new Blob([i]):new Blob([JSON.stringify(i)]),yield this.behaviors.import(s,n),this.events.emitImported(this.model.exports),this.model}return Promise.reject("Import impossible, behaviors has no import function")}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,rt,"f").promise,this.behaviors.importPointEvents?(yield this.behaviors.importPointEvents(i),this.events.emitImported(this.model.exports),this.model):Promise.reject("Import impossible, behaviors has no importPointEvents function")}))}}function getAvailableFontList(i){var n,s,a;return __awaiter(this,void 0,void 0,(function*(){if(!(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.scheme)&&!(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.host))return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!");if(!(null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.lang))return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!");const l=i.server,d=yield fetch(`${l.scheme}://${l.host}/api/v4.0/iink/font/google/language/`+i.recognition.lang),{result:c}=yield d.json();return c.sort()}))}function getAvailableLanguageList(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){if((null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.scheme)&&(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.host)){const n=i.server;return(yield fetch(`${n.scheme}://${n.host}/api/v4.0/iink/availableLanguageList`)).json()}return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!")}))}tt=new WeakMap,it=new WeakMap,nt=new WeakMap,st=new WeakMap,rt=new WeakMap,vt=new WeakMap,mt=new WeakMap,et=new WeakSet,ot=function _Editor_instantiateBehaviors(i){var n;if(!(null==i?void 0:i.configuration))throw new Error("Configuration required");let s;__classPrivateFieldGet(this,nt,"f")&&__classPrivateFieldGet(this,nt,"f").destroy(),s="REST"===(null===(n=i.configuration.server)||void 0===n?void 0:n.protocol)?new RestBehaviors(i):new WSBehaviors(i),__classPrivateFieldSet(this,nt,Object.assign(s,i.behaviors),"f")},at=function _Editor_initializeBehaviors(){return __classPrivateFieldSet(this,rt,new DeferredPromise,"f"),__classPrivateFieldGet(this,tt,"f").style.display="initial",__classPrivateFieldGet(this,et,"m",dt).call(this),this.behaviors.init(this.wrapperHTML).then((()=>__awaiter(this,void 0,void 0,(function*(){this.wrapperHTML.editor=this,__classPrivateFieldGet(this,rt,"f").resolve(),this.events.emitLoaded()})))).catch((i=>{__classPrivateFieldGet(this,rt,"f").reject(i),__classPrivateFieldGet(this,et,"m",ct).call(this,i)})).finally((()=>(__classPrivateFieldGet(this,tt,"f").style.display="none",__classPrivateFieldGet(this,rt,"f").promise)))},lt=function _Editor_initializeSmartGuide(){var i;if(null===(i=__classPrivateFieldGet(this,st,"f"))||void 0===i||i.destroy(),this.configuration.rendering.smartGuide.enable){let i;switch(__classPrivateFieldSet(this,st,new SmartGuide,"f"),this.configuration.recognition.type){case"TEXT":i=this.configuration.recognition.text.margin;break;case"MATH":i=this.configuration.recognition.math.margin;break;default:i={top:20,left:10,right:10,bottom:10}}__classPrivateFieldGet(this,st,"f").init(this.wrapperHTML,i,this.configuration.rendering)}},dt=function _Editor_cleanMessage(){__classPrivateFieldGet(this,it,"f").style.display="none",__classPrivateFieldGet(this,it,"f").innerHTML=""},ct=function _Editor_showError(i){if(__classPrivateFieldGet(this,it,"f").style.display="initial",__classPrivateFieldGet(this,it,"f").classList.add("error-msg"),__classPrivateFieldGet(this,it,"f").classList.remove("info-msg"),__classPrivateFieldGet(this,it,"f").innerText=i.message,this.debug){const n=document.createElement("p");n.innerHTML=i.name,__classPrivateFieldGet(this,it,"f").prepend(n);const s=document.createElement("p");s.style.width="50vw",s.style.marginLeft="calc(-25vw + 100px)",s.innerHTML=i.stack||"",__classPrivateFieldGet(this,it,"f").appendChild(s)}},ht=function _Editor_showNotif(i){__classPrivateFieldGet(this,it,"f").style.display="initial",__classPrivateFieldGet(this,it,"f").classList.add("info-msg"),__classPrivateFieldGet(this,it,"f").classList.remove("error-msg"),__classPrivateFieldGet(this,it,"f").innerText=i.message,setTimeout((()=>{__classPrivateFieldGet(this,et,"m",dt).call(this)}),i.timeout||2500)},ut=function _Editor_showStrokesIfDebug(){if(this.debug){let i=document.getElementById("stroke-panel");const n=JSON.stringify(this.model.rawStrokes.map((i=>({pointerType:i.pointerType,pointerId:i.pointerId,pointers:i.pointers}))));i||(i=document.createElement("div"),i.id="stroke-panel",i.addEventListener("click",(()=>{navigator.clipboard.writeText(null==i?void 0:i.innerText),__classPrivateFieldGet(this,et,"m",ht).call(this,{message:"strokes copied to clipboard!",timeout:1500})})),this.wrapperHTML.appendChild(i)),i.innerText=n}},pt=function _Editor_addListeners(){InternalEvent.getInstance().addConvertListener(this.convert.bind(this)),InternalEvent.getInstance().addClearListener(this.clear.bind(this)),InternalEvent.getInstance().addErrorListener(__classPrivateFieldGet(this,et,"m",ct).bind(this)),InternalEvent.getInstance().addImportJIIXListener(__classPrivateFieldGet(this,et,"m",_t).bind(this)),InternalEvent.getInstance().addExportedListener(__classPrivateFieldGet(this,et,"m",gt).bind(this)),InternalEvent.getInstance().addNotifListener(__classPrivateFieldGet(this,et,"m",ht).bind(this)),InternalEvent.getInstance().addClearMessageListener(__classPrivateFieldGet(this,et,"m",dt).bind(this)),InternalEvent.getInstance().addContextChangeListener(__classPrivateFieldGet(this,vt,"f").bind(this)),InternalEvent.getInstance().addIdleListener(__classPrivateFieldGet(this,mt,"f").bind(this))},gt=function _Editor_onExport(i){var n;if(this.model.mergeExport(i),this.configuration.rendering.smartGuide.enable&&i&&i["application/vnd.myscript.jiix"]){const s=i["application/vnd.myscript.jiix"];null===(n=__classPrivateFieldGet(this,st,"f"))||void 0===n||n.update(s)}__classPrivateFieldGet(this,et,"m",ut).call(this),this.events.emitExported(i)},_t=function _Editor_onImportJIIX(i){this.import(new Blob([JSON.stringify(i)],{type:l.JIIX}),l.JIIX)};export{CanvasRenderer,CanvasStroker,Configuration,re as Constants,Ie as DefaultConfiguration,Te as DefaultEventsConfiguration,Fe as DefaultGrabberConfiguration,Pe as DefaultPenStyle,ke as DefaultRecognitionConfiguration,Me as DefaultRenderingConfiguration,Ce as DefaultServerConfiguration,we as DefaultTheme,Ge as DefaultTriggerConfiguration,Le as DefaultUndoRedoConfiguration,DeferredPromise,Editor,InternalEvent,d as ModeInteraction,Model,PointerEventGrabber,PublicEvent,RestBehaviors,RestRecognizer,SVGStroker,SmartGuide,Stroke,me as StyleHelper,StyleManager,UndoRedoContext,UndoRedoManager,WSBehaviors,WSRecognizer,WSSVGRenderer,ae as canvasRendererShape,le as canvasRendererStroke,ce as canvasRendererText,computeHmac,convertStrokeToJSON,Qe as geometric,getAvailableFontList,getAvailableLanguageList,he as quadradicsUtils,ye as version}; +//# sourceMappingURL=iink.esm.js.map diff --git a/dist/iink.esm.js.map b/dist/iink.esm.js.map new file mode 100644 index 00000000..48886aed --- /dev/null +++ b/dist/iink.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.esm.js","sources":["../node_modules/tslib/tslib.es6.mjs","../src/Constants.ts","../src/event/PublicEvent.ts","../src/event/InternalEvent.ts","../src/smartguide/SmartGuide.ts","../src/utils/DeferredPromise.ts","../src/grabber/PointerEventGrabber.ts","../src/renderer/canvas/CanvasRendererShapeSymbol.ts","../src/renderer/canvas/CanvasRendererStrokeSymbol.ts","../src/renderer/canvas/CanvasRendererTextSymbol.ts","../src/renderer/QuadraticUtils.ts","../src/renderer/canvas/CanvasStroker.ts","../src/renderer/canvas/CanvasRenderer.ts","../node_modules/json-css/lib/jsoncss.min.js","../src/style/StyleHelper.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/x64-core.js","../node_modules/crypto-js/sha512.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/hmac-sha512.js","../src/recognizer/CryptoHelper.ts","../src/utils/version.ts","../src/model/Stroke.ts","../src/recognizer/RestRecognizer.ts","../src/undo-redo/UndoRedoContext.ts","../src/undo-redo/UndoRedoManager.ts","../src/utils/MergeHelper.ts","../src/style/DefaultPenStyle.ts","../src/style/DefaultTheme.ts","../src/style/StyleManager.ts","../src/configuration/DefaultConfiguration.ts","../src/configuration/Configuration.ts","../src/utils/geometric.ts","../src/model/Model.ts","../src/behaviors/RestBehaviors.ts","../src/recognizer/WSRecognizer.ts","../src/renderer/svg/SVGStroker.ts","../src/renderer/svg/WSSVGRenderer.ts","../src/behaviors/WSBehaviors.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Editor.ts","../src/utils/font.ts","../src/utils/language.ts"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n};\n","/**\n * @group Error\n * @remarks List all errors generated by the backend with their descriptions\n */\nexport const Error = {\n NO_ACTIVITY: \"Session closed due to no activity.\",\n WRONG_CREDENTIALS: \"Application credentials are invalid. Please check or regenerate your application key and hmackey.\",\n TOO_OLD: \"Session is too old. Max Session Duration Reached.\",\n UNKNOW: \"An unknown error has occurred.\",\n ABNORMAL_CLOSURE: \"MyScript recognition server is not reachable.\",\n CANT_ESTABLISH: \"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.\",\n GOING_AWAY: \"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.\",\n PROTOCOL_ERROR: \"MyScript recognition server terminated the connection due to a protocol error.\",\n UNSUPPORTED_DATA: \"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)\",\n INVALID_FRAME_PAULOAD: \"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).\",\n POLICY_VIOLATION: \"MyScript recognition server terminated the connection because it received a message that violates its policy.\",\n MESSAGE_TOO_BIG: \"MyScript recognition server terminated the connection because a data frame was received that is too large.\",\n INTERNAL_ERROR: \"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.\",\n SERVICE_RESTART: \"MyScript recognition server terminated the connection because it is restarting.\",\n TRY_AGAIN: \"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.\",\n BAD_GATEWAY: \"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.\",\n TLS_HANDSHAKE: \"MyScript recognition server connection was closed due to a failure to perform a TLS handshake\"\n} as const\n\n/**\n * @event\n * @remarks Lists all events that can be listened to on the editor or DOM element\n */\nexport const EventType = {\n /**\n * @event\n * event emitted when history has changed i.e. the context of undo-redo\n */\n CHANGED: \"changed\",\n /**\n * @event\n * event emitted when clearing is complete\n */\n CLEARED: \"cleared\",\n /**\n * @event\n * event emitted after the conversion is complete\n */\n CONVERTED: \"converted\",\n /**\n * @event\n * event emitted when the editor encounters an error\n */\n ERROR: \"error\",\n /**\n * @event\n * event emitted on click on pointer events\n */\n POINTEREVENTS: \"pointer_events\",\n /**\n * @event\n * event emitted after the end of the export\n */\n EXPORTED: \"exported\",\n /**\n * @event\n * event emitted after the end of the import\n */\n IMPORTED: \"imported\",\n /**\n * @event\n * event emitted when the server is idle after a job\n */\n IDLE: \"idle\",\n /**\n * @event\n * event emitted after full editor initialization\n */\n LOADED: \"loaded\",\n} as const\n\n/**\n * @internal\n */\nexport const InternalEventType = {\n SVG_PATCH: \"internal_svg_patch\",\n EXPORTED: \"internal_exported\",\n CLEAR_MESSAGE: \"internal_clear_message\",\n ERROR: \"internal_error\",\n NOTIF: \"internal_notif\",\n IMPORT_JIIX: \"internal_import_jiix\",\n CONVERT: \"internal_convert\",\n CLEAR: \"internal_clear\",\n CONTEXT_CHANGE: \"internal_context_change\",\n IDLE: \"internal_idle\",\n WS_CLOSED: \"internal_websocket_closed\",\n} as const\n\n/**\n * @internal\n */\nexport const WSMessage = {\n CLOSE_RECOGNIZER: \"CLOSE_RECOGNIZER\"\n}\n\n/**\n * @group Export\n * @remarks List all supported MIME types for export.\n * @remarks Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition}\n */\nexport const Exports = {\n JIIX: \"application/vnd.myscript.jiix\",\n TEXT: \"text/plain\",\n LATEX: \"application/x-latex\",\n MATHML: \"application/mathml+xml\",\n SVG: \"image/svg+xml\",\n OFFICE_DOCUMENT: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n} as const\n\n/**\n * @group Editor\n * @remarks List the possibilities of interactions\n */\nexport const enum ModeInteraction\n{\n Writing = \"writing\",\n Erasing = \"erasing\",\n // Selecting = \"selecting\"\n}\n\n/**\n * @group Constants\n */\nexport default {\n Error,\n EventType,\n InternalEventType,\n Exports,\n WSMessage,\n} as const\n","import { IModel, TExport } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { EventType } from \"../Constants\"\n\nexport class PublicEvent extends EventTarget\n{\n static #instance: PublicEvent\n #element?: HTMLElement\n\n private constructor()\n {\n super()\n }\n\n public static getInstance(): PublicEvent\n {\n if (!PublicEvent.#instance) {\n PublicEvent.#instance = new PublicEvent()\n }\n\n return PublicEvent.#instance\n }\n\n setElement(el: HTMLElement)\n {\n this.#element = el\n }\n\n #emit(type: string, data?: unknown): void\n {\n const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))\n this.dispatchEvent(evt)\n this.#element?.dispatchEvent(evt)\n }\n\n emitLoaded(): void\n {\n this.#emit(EventType.LOADED)\n }\n\n emitExported(exports: TExport): void\n {\n this.#emit(EventType.EXPORTED, exports)\n }\n\n emitChanged(undoRedoContext: TUndoRedoContext): void\n {\n this.#emit(EventType.CHANGED, {\n ...undoRedoContext,\n canClear: !undoRedoContext.empty\n })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#emit(EventType.IDLE, idle)\n }\n\n emitCleared(model?: IModel): void\n {\n this.#emit(EventType.CLEARED, model)\n }\n\n emitConverted(exports: TExport): void\n {\n this.#emit(EventType.CONVERTED, exports)\n }\n\n emitImported(exports: TExport): void\n {\n this.#emit(EventType.IMPORTED, exports)\n }\n}\n","import { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { InternalEventType } from \"../Constants\"\n\nexport class InternalEvent extends EventTarget\n{\n static #instance: InternalEvent\n #abortController: AbortController\n\n private constructor()\n {\n super()\n this.#abortController = new AbortController()\n }\n\n public static getInstance(): InternalEvent\n {\n if (!InternalEvent.#instance) {\n InternalEvent.#instance = new InternalEvent()\n }\n\n return InternalEvent.#instance\n }\n\n removeAllListeners(): void\n {\n this.#abortController.abort()\n }\n\n #emit(type: string, data?: unknown): void\n {\n this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)))\n }\n\n emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void\n {\n this.#emit(InternalEventType.SVG_PATCH, patchChange)\n }\n addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void\n {\n this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal })\n }\n\n emitExported(exports: TExport): void\n {\n this.#emit(InternalEventType.EXPORTED, exports)\n }\n addExportedListener(callback: (exports: TExport) => void): void\n {\n this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal })\n }\n\n emitClearMessage(): void\n {\n this.#emit(InternalEventType.CLEAR_MESSAGE)\n }\n addClearMessageListener(callback: () => void): void\n {\n this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitError(err: Error): void\n {\n this.#emit(InternalEventType.ERROR, err)\n }\n addErrorListener(callback: (err: Error) => void): void\n {\n this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal })\n }\n\n emitWSClosed(): void\n {\n this.#emit(InternalEventType.WS_CLOSED)\n }\n addWSClosedListener(callback: () => void): void\n {\n this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitNotif(notif: { message: string, timeout?: number }): void\n {\n this.#emit(InternalEventType.NOTIF, notif)\n }\n addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void\n {\n this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal })\n }\n\n emitImportJIIX(jiix: TJIIXExport): void\n {\n this.#emit(InternalEventType.IMPORT_JIIX, jiix)\n }\n addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void\n {\n this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal })\n }\n\n emitConvert(conversionState: TConverstionState = \"DIGITAL_EDIT\"): void\n {\n this.#emit(InternalEventType.CONVERT, conversionState)\n }\n addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void\n {\n this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal })\n }\n\n emitClear(): void\n {\n this.#emit(InternalEventType.CLEAR)\n }\n addClearListener(callback: () => void): void\n {\n this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitContextChange(context: TUndoRedoContext): void\n {\n this.#emit(InternalEventType.CONTEXT_CHANGE, context)\n }\n addContextChangeListener(callback: (context: TUndoRedoContext) => void): void\n {\n this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#emit(InternalEventType.IDLE, idle)\n }\n addIdleListener(callback: (idle: boolean) => void): void\n {\n this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal })\n }\n}\n","import { TMarginConfiguration } from \"../@types/configuration/recognition/MarginConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TJIIXExport, TWordExport } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\n\nexport class SmartGuide\n{\n uuid: string\n #smartGuideElement!: HTMLDivElement\n #prompterContainerElement!: HTMLDivElement\n #prompterTextElement!: HTMLDivElement\n #ellipsisElement!: HTMLDivElement\n #tagElement!: HTMLDivElement\n #candidatesElement!: HTMLDivElement\n #menuElement!: HTMLDivElement\n #convertElement!: HTMLButtonElement\n #copyElement!: HTMLButtonElement\n #deleteElement!: HTMLButtonElement\n #fadeOutTimout?: ReturnType\n #isMenuOpen!: boolean\n margin: TMarginConfiguration\n renderingConfiguration!: TRenderingConfiguration\n jiix?: TJIIXExport\n lastWord?: TWordExport\n wordToChange?: TWordExport\n\n constructor()\n {\n this.uuid = Math.random().toString(10).substring(2, 12)\n this.margin = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n this.#createWrapperElement()\n this.#createPrompterContainerElement()\n this.#createPrompterTextElement()\n this.#createEllipsisElement()\n this.#createTagElement()\n this.#createCandidatesElement()\n this.#createMoreMenuElement()\n this.#createConvertElement()\n this.#createCopyElement()\n this.#createDeleteElement()\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n #createWrapperElement(): void\n {\n this.#smartGuideElement = document.createElement(\"div\")\n this.#smartGuideElement.id = `smartguide-${ this.uuid }`\n this.#smartGuideElement.classList.add(\"smartguide\")\n }\n\n #createPrompterContainerElement(): void\n {\n this.#prompterContainerElement = document.createElement(\"div\")\n this.#prompterContainerElement.id = `prompter-container-${ this.uuid }`\n this.#prompterContainerElement.classList.add(\"prompter-container\")\n // this.#prompterContainerElement.appendChild(textElement)\n }\n\n #createPrompterTextElement(): void\n {\n this.#prompterTextElement = document.createElement(\"div\")\n this.#prompterTextElement.id = `prompter-text-${ this.uuid }`\n this.#prompterTextElement.classList.add(\"prompter-text\")\n this.#prompterTextElement.setAttribute(\"touch-action\", \"none\")\n }\n\n #createEllipsisElement(): void\n {\n this.#ellipsisElement = document.createElement(\"div\")\n this.#ellipsisElement.id = `ellipsis-${ this.uuid }`\n this.#ellipsisElement.classList.add(\"ellipsis\")\n this.#ellipsisElement.innerHTML = \"...\"\n }\n\n #createTagElement(): void\n {\n this.#tagElement = document.createElement(\"div\")\n this.#tagElement.id = `tag-icon-${ this.uuid }`\n this.#tagElement.classList.add(\"tag-icon\")\n this.#tagElement.innerHTML = \"¶\"\n }\n\n #createCandidatesElement(): void\n {\n this.#candidatesElement = document.createElement(\"div\")\n this.#candidatesElement.id = `candidates-${ this.uuid }`\n this.#candidatesElement.classList.add(\"candidates\")\n }\n\n #createMoreMenuElement(): void\n {\n this.#menuElement = document.createElement(\"div\")\n this.#menuElement.id = `more-menu-${ this.uuid }`\n this.#menuElement.classList.add(\"more-menu\")\n }\n\n #createConvertElement(): void\n {\n this.#convertElement = document.createElement(\"button\")\n this.#convertElement.id = `convert-${ this.uuid }`\n this.#convertElement.classList.add(\"options-label-button\")\n this.#convertElement.innerHTML = \"Convert\"\n }\n\n #createCopyElement(): void\n {\n this.#copyElement = document.createElement(\"button\")\n this.#copyElement.id = `copy-${ this.uuid }`\n this.#copyElement.classList.add(\"options-label-button\")\n this.#copyElement.innerHTML = \"Copy\"\n }\n\n #createDeleteElement(): void\n {\n this.#deleteElement = document.createElement(\"button\")\n this.#deleteElement.id = `delete-${ this.uuid }`\n this.#deleteElement.classList.add(\"options-label-button\")\n this.#deleteElement.innerHTML = \"Delete\"\n }\n\n init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void\n {\n domElement.appendChild(this.#smartGuideElement)\n this.#smartGuideElement.appendChild(this.#tagElement)\n\n this.#prompterContainerElement.appendChild(this.#prompterTextElement)\n this.#smartGuideElement.appendChild(this.#prompterContainerElement)\n\n this.#smartGuideElement.appendChild(this.#ellipsisElement)\n\n this.#menuElement.appendChild(this.#convertElement)\n this.#menuElement.appendChild(this.#copyElement)\n this.#menuElement.appendChild(this.#deleteElement)\n this.#smartGuideElement.appendChild(this.#menuElement)\n this.#menuElement.classList.add(\"close\")\n this.#isMenuOpen = false\n\n this.#smartGuideElement.appendChild(this.#candidatesElement)\n this.#candidatesElement.style.display = \"none\"\n this.margin = margin\n this.renderingConfiguration = renderingConfiguration\n this.#addListeners()\n\n this.#show()\n if (this.renderingConfiguration.smartGuide.fadeOut.enable) {\n this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration)\n }\n\n this.resize()\n }\n\n #initFadeOutObserver(duration = 3000): void\n {\n const observer = new MutationObserver(() =>\n {\n clearTimeout(this.#fadeOutTimout)\n if (\n !this.#smartGuideElement.classList.contains(\"smartguide-out\") &&\n this.#candidatesElement.style.display === \"none\" &&\n !this.#isMenuOpen\n ) {\n this.#fadeOutTimout = setTimeout(() =>\n {\n this.#hide()\n }, duration)\n }\n })\n observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true })\n }\n\n #show(): void\n {\n this.#smartGuideElement.classList.remove(\"smartguide-out\")\n this.#smartGuideElement.classList.add(\"smartguide-in\")\n }\n #hide(): void\n {\n this.#smartGuideElement.classList.add(\"smartguide-out\")\n this.#smartGuideElement.classList.remove(\"smartguide-in\")\n }\n\n #showCandidates = (target: HTMLElement) =>\n {\n const wordId = parseInt(target.id.replace(\"word-\", \"\").replace(this.uuid, \"\"))\n const words = this.jiix?.words as TWordExport[]\n this.wordToChange = words[wordId]\n if (this.wordToChange) {\n this.wordToChange.id = wordId.toString()\n this.#candidatesElement.innerHTML = \"\"\n if (this.wordToChange?.candidates) {\n this.#candidatesElement.style.display = \"flex\"\n this.wordToChange.candidates.forEach((word, index) =>\n {\n if (this.wordToChange?.label === word) {\n this.#candidatesElement.innerHTML += `${ word }`\n } else {\n this.#candidatesElement.innerHTML += `${ word }`\n }\n })\n const top = 48\n const left = target.getBoundingClientRect().left - 60\n this.#candidatesElement.style.top = `${ top }px`\n this.#candidatesElement.style.left = `${ left }px`\n\n const parent = target.parentNode?.parentNode?.parentNode\n if (parent) {\n parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode)\n }\n }\n }\n }\n #hideCandidates(): void\n {\n this.#candidatesElement.style.display = \"none\"\n }\n\n #openMenu(): void\n {\n this.#menuElement.classList.add(\"open\")\n this.#menuElement.classList.remove(\"close\")\n this.#isMenuOpen = true\n }\n #closeMenu(): void\n {\n this.#menuElement.classList.add(\"close\")\n this.#menuElement.classList.remove(\"open\")\n this.#isMenuOpen = false\n }\n\n #onClickEllipsis = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.#isMenuOpen ? this.#closeMenu() : this.#openMenu()\n this.#hideCandidates()\n }\n\n #onClickConvert = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitConvert()\n this.#closeMenu()\n }\n\n #onClickCopy = async (evt: Event): Promise =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n try {\n this.#closeMenu()\n let message = \"Nothing to copy\"\n if (this.#prompterTextElement.innerText) {\n message = `\"${ this.#prompterTextElement.innerText }\" copied to clipboard`\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n this.internalEvent.emitNotif({ message, timeout: 1500 })\n } catch (err) {\n this.internalEvent.emitError(err as Error)\n }\n }\n\n #onClickDelete = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitClear()\n this.#closeMenu()\n }\n\n #onClickCandidate = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n const target = evt.target as HTMLElement\n const candidate = target.innerText\n if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) {\n this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate\n this.internalEvent.emitImportJIIX(this.jiix)\n }\n this.#candidatesElement.style.display = \"none\"\n }\n\n #onClickPrompter = (evt: Event): void =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.#closeMenu()\n const target = evt.target as HTMLElement\n if (target.id !== this.#prompterTextElement.id) {\n this.#showCandidates(target)\n } else {\n this.#hideCandidates()\n }\n\n }\n\n #onClickOutSide = () =>\n {\n this.#hideCandidates()\n this.#closeMenu()\n }\n\n #addListeners(): void\n {\n this.#ellipsisElement.addEventListener(\"pointerdown\", evt => this.#onClickEllipsis(evt))\n this.#convertElement.addEventListener(\"pointerdown\", evt => this.#onClickConvert(evt))\n this.#copyElement.addEventListener(\"pointerdown\", evt => this.#onClickCopy(evt))\n this.#deleteElement.addEventListener(\"pointerdown\", evt => this.#onClickDelete(evt))\n this.#prompterTextElement.addEventListener(\"pointerdown\", evt => this.#onClickPrompter(evt))\n this.#candidatesElement.addEventListener(\"pointerdown\", evt => this.#onClickCandidate(evt))\n document.addEventListener(\"pointerdown\", () => this.#onClickOutSide())\n }\n\n resize(): void\n {\n const mmToPixels = 3.779527559\n const marginTop = this.margin.top * mmToPixels\n const marginLeft = this.margin.left * mmToPixels\n const marginRight = this.margin.right * mmToPixels\n // 12 is the space between line in mm\n const top = marginTop - (12 * mmToPixels)\n\n this.#smartGuideElement.style.top = `${ top }px`\n this.#smartGuideElement.style.left = `${ marginLeft }px`\n this.#smartGuideElement.style.right = `${ marginRight }px`\n\n let left = this.#tagElement.offsetWidth\n this.#prompterContainerElement.style.marginLeft = `${ left }px`\n this.#prompterContainerElement.style.width = `${ this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight }px`\n left += this.#prompterContainerElement.offsetWidth\n this.#menuElement.style.left = `${ left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth }px`\n this.#menuElement.style.top = `${ this.#ellipsisElement.offsetHeight }px`\n this.#ellipsisElement.style.left = `${ left }px`\n }\n\n update(exports: TJIIXExport): void\n {\n this.jiix = exports\n const createWordSpan = (index: number, word?: TWordExport) =>\n {\n const span = document.createElement(\"span\")\n span.id = `word-${ index }${ this.uuid }`\n if (word) {\n span.textContent = word.label\n } else {\n span.innerHTML = \" \"\n }\n return span\n }\n\n const populatePrompter = () =>\n {\n this.#prompterTextElement.innerHTML = \"\"\n if (this.jiix?.words) {\n const words = this.jiix.words as TWordExport[]\n const myFragment = document.createDocumentFragment()\n words.forEach((word, index) =>\n {\n if (word.label === \" \" || word.label.includes(\"\\n\")) {\n myFragment.appendChild(createWordSpan(index))\n } else if (index !== words.length - 1) {\n myFragment.appendChild(createWordSpan(index, word))\n } else {\n this.#prompterTextElement.appendChild(myFragment)\n if (this.lastWord) {\n this.lastWord = word\n }\n const span = createWordSpan(index, word)\n // This is used to scroll to last word if last word is modified\n if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) {\n span.classList.add(\"added-word\")\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n this.lastWord = word\n } else {\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n }\n }\n })\n }\n }\n populatePrompter()\n if (this.jiix?.words?.length) {\n this.#show()\n }\n }\n\n clear(): void\n {\n this.#prompterTextElement.innerHTML = \"\"\n this.#candidatesElement.innerHTML = \"\"\n this.#hide()\n }\n\n destroy(): void\n {\n this.#smartGuideElement.innerHTML = \"\"\n }\n}\n","\nexport class DeferredPromise {\n promise: Promise\n resolve!: (value: T) => void\n reject!: (value: Error) => void\n\n isFullFilled: boolean\n isPending: boolean\n\n\n constructor()\n {\n this.isFullFilled = false\n this.isPending = true\n\n this.promise = new Promise((resolve, reject) =>\n {\n this.reject = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return reject(v)\n }\n this.resolve = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return resolve(v as T)\n }\n })\n }\n}\n","import { IGrabber } from \"../@types/grabber/Grabber\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TPointer } from \"../@types/geometry\"\n\nexport class PointerEventGrabber implements IGrabber\n{\n private configuration: TGrabberConfiguration\n\n private domElement!: HTMLElement\n\n private activePointerId?: number\n\n private prevent = (e: Event) => e.preventDefault()\n\n onPointerDown!: (evt: PointerEvent, point: TPointer) => void\n onPointerMove!: (evt: PointerEvent, point: TPointer) => void\n onPointerUp!: (evt: PointerEvent, point: TPointer) => void\n\n constructor(configuration: TGrabberConfiguration)\n {\n this.configuration = configuration\n }\n\n private roundFloat(oneFloat: number, requestedFloatPrecision: number): number\n {\n if (requestedFloatPrecision >= 0) {\n const floatPrecision: number = Math.pow(10, requestedFloatPrecision)\n return Math.round(oneFloat / floatPrecision) * floatPrecision\n }\n return oneFloat\n }\n\n private extractPoint(event: MouseEvent | TouchEvent): TPointer\n {\n let clientX: number, clientY: number\n if (\"changedTouches\" in event) {\n ({ clientX, clientY } = event.changedTouches[0])\n } else {\n ({ clientX, clientY } = event)\n }\n const rect: DOMRect = this.domElement.getBoundingClientRect()\n return {\n x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision),\n y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision),\n t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision),\n p: (event as PointerEvent).pressure || 1,\n\n }\n }\n\n private pointerDownHandler = (evt: PointerEvent) =>\n {\n // exit if not a left click or multi-touch\n if (evt.button !== 0 || evt.buttons !== 1) {\n return\n }\n\n this.activePointerId = evt.pointerId\n\n if (this.onPointerDown) {\n const point = this.extractPoint(evt)\n this.onPointerDown(evt, point)\n }\n }\n\n private pointerMoveHandler = (evt: PointerEvent) =>\n {\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n if (this.onPointerMove) {\n const point = this.extractPoint(evt)\n this.onPointerMove(evt, point)\n }\n }\n }\n\n private pointerUpHandler = (evt: PointerEvent) =>\n {\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n this.activePointerId = undefined\n evt.stopPropagation()\n if (this.onPointerUp) {\n const point = this.extractPoint(evt)\n this.onPointerUp(evt, point)\n }\n }\n }\n\n attach(domElement: HTMLElement)\n {\n if (this.domElement) {\n this.detach()\n }\n this.domElement = domElement\n this.domElement.addEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement.addEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n\n this.domElement.addEventListener(\"touchmove\", this.prevent)\n\n // FIXME investigate why this is needed for iOS devices\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.addEventListener(\"pointerdown\", () => { })\n }\n\n detach()\n {\n this.domElement?.removeEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement?.removeEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"touchmove\", this.prevent)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.removeEventListener(\"pointerdown\", () => { })\n }\n}\n","\nimport { TPoint } from \"../../@types/geometry\"\nimport { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const ShapeSymbols = {\n table: \"table\",\n shape: \"shape\",\n recognizedShape: \"recognizedShape\",\n ellipse: \"ellipse\",\n line: \"line\"\n}\n\nfunction phi(angle: number): number\n{\n let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI\n if (returnedAngle < -Math.PI) {\n returnedAngle += Math.PI * 2\n }\n return returnedAngle\n}\n\nfunction drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[]\n{\n const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse\n const angleStep = 0.02 // angle delta between interpolated\n\n let z1 = Math.cos(orientation)\n let z3 = Math.sin(orientation)\n let z2 = z1\n let z4 = z3\n z1 *= maxRadius\n z2 *= minRadius\n z3 *= maxRadius\n z4 *= minRadius\n\n const n = Math.floor(Math.abs(sweepAngle) / angleStep)\n\n const boundariesPoints = []\n\n context2D.save()\n try {\n context2D.beginPath()\n\n for (let i = 0; i <= n; i++) {\n const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian\n const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius)\n\n const cosAlpha = Math.cos(alpha)\n const sinAlpha = Math.sin(alpha)\n\n // current point\n const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha)\n const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha)\n if (i === 0) {\n context2D.moveTo(x, y)\n } else {\n context2D.lineTo(x, y)\n }\n\n if (i === 0 || i === n) {\n boundariesPoints.push({ x, y })\n }\n }\n\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n\n return boundariesPoints\n}\n\nfunction drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number)\n{\n const alpha = phi(angle + (Math.PI * (7 / 8)))\n const beta = phi(angle - (Math.PI * (7 / 8)))\n context2D.save()\n try {\n context2D.fillStyle = context2D.strokeStyle\n\n context2D.moveTo(headPoint.x, headPoint.y)\n context2D.beginPath()\n context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha)))\n context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta)))\n context2D.lineTo(headPoint.x, headPoint.y)\n context2D.fill()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol)\n{\n const points = drawEllipseArc(context2D, shapeEllipse)\n\n if (shapeEllipse?.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0)\n }\n if (shapeEllipse?.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a line\n * @param {Object} context2D Current rendering context2D\n * @param {{x: Number, y: Number}} p1 Origin point\n * @param {{x: Number, y: Number}} p2 Destination point\n */\nexport function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint)\n{\n context2D.save()\n try {\n context2D.beginPath()\n context2D.moveTo(p1.x, p1.y)\n context2D.lineTo(p2.x, p2.y)\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol)\n{\n drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint)\n if (shapeLine.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0)\n }\n if (shapeLine.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a shape symbol\n * @param {Object} context2D Current rendering context2D\n * @param {Object} symbol Symbol to draw\n */\nexport function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = symbol.style.width as number\n context2D.strokeStyle = symbol.style.color as string\n\n if (symbol.elementType) {\n switch (symbol.elementType) {\n case ShapeSymbols.shape: {\n const shapeSymbol = symbol as TShapeSymbol\n drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex])\n break\n }\n case ShapeSymbols.table:{\n const tableSymbols = symbol as TShapeTableSymbol\n tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line))\n break\n }\n case ShapeSymbols.line: {\n const lineSymbol = symbol as TLineSymbol\n drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2)\n break\n }\n default:\n // logger.error(`${ symbol.elementType } not implemented`)\n break\n }\n } else {\n switch (symbol.type) {\n case ShapeSymbols.ellipse: {\n drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol)\n break\n }\n case ShapeSymbols.line: {\n drawShapeLine(context2D, symbol as TShapeLineSymbol)\n break\n }\n case ShapeSymbols.recognizedShape: {\n const recognizedShape = symbol as TShapeRecognizedSymbol\n recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive))\n break\n }\n default:\n // logger.error(`${ symbol.type } not implemented`)\n break\n }\n }\n } finally {\n context2D.restore()\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) {\n if (stroker && stroke && stroke.pointerType !== \"eraser\") {\n stroker.drawStroke(context2D, stroke)\n }\n}\n","import { TPoint } from \"../../@types/geometry\"\nimport { drawLine } from \"./CanvasRendererShapeSymbol\"\nimport { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const TextSymbols = {\n inputCharacter: \"inputCharacter\",\n char: \"char\",\n string: \"string\",\n textLine: \"textLine\"\n}\n\nfunction drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol)\n{\n const delta = data.width / label.length\n const p1: TPoint = {\n x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n const p2: TPoint = {\n x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n drawLine(context2D, p1, p2)\n}\n\nfunction drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol)\n{\n context2D.save()\n try {\n context2D.font = `${ data.textHeight }px serif`\n context2D.textAlign = (data.justificationType === \"CENTER\") ? \"center\" : \"left\"\n context2D.textBaseline = \"bottom\"\n context2D.fillStyle = context2D.strokeStyle\n context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height))\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol)\n{\n drawText(context2D, textLine.label, textLine.data)\n textLine.underlineList.forEach((underline) =>\n {\n drawUnderline(context2D, underline, textLine.label, textLine.data)\n })\n}\n\n/**\n * Draw a text symbol\n * @param {Object} context Current rendering context\n * @param {Object} symbol Symbol to draw\n */\nexport function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = (symbol.style.width as number)\n context2D.strokeStyle = (symbol.style.color as string)\n const type: string = symbol.elementType || symbol.type\n\n switch (type) {\n case TextSymbols.textLine:\n drawTextLine(context2D, symbol as TTextUnderlineSymbol)\n break\n default:\n console.info(`drawTextSymbol => ${symbol.elementType} not implemented`)\n break\n }\n\n } finally {\n context2D.restore()\n }\n}\n","import { TPoint, TPointer } from \"../@types/geometry\"\n\nexport function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]\n{\n const radius = point.p * width\n return [\n {\n x: (point.x - (Math.sin(angle) * radius)),\n y: (point.y + (Math.cos(angle) * radius))\n },\n {\n x: (point.x + (Math.sin(angle) * radius)),\n y: (point.y - (Math.cos(angle) * radius))\n }\n ]\n}\n\nexport function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer\n{\n return {\n x: ((point2.x + point1.x) / 2),\n y: ((point2.y + point1.y) / 2),\n p: ((point2.p + point1.p) / 2),\n t: ((point2.t + point1.t) / 2)\n }\n}\n\nexport function computeAxeAngle(begin: TPointer, end: TPointer): number\n{\n return Math.atan2(end.y - begin.y, end.x - begin.x)\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class CanvasStroker\n{\n\n private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void\n {\n context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true)\n }\n\n private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y)\n }\n\n private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n context2d.moveTo(linkPoints[0].x, linkPoints[0].y)\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - ((i * Math.PI) / ARCSPLIT)\n context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle)))\n }\n }\n\n private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width)\n const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y)\n }\n\n drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void\n {\n const NUMBER_POINTS = stroke.pointers.length\n const NUMBER_QUADRATICS = NUMBER_POINTS - 2\n const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth\n const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle\n const firstPoint = stroke.pointers[0] as TPointer\n\n context2d.save()\n try {\n context2d.beginPath()\n if (NUMBER_POINTS < 3) {\n this.renderArc(context2d, firstPoint, width * 0.6)\n } else {\n this.renderArc(context2d, firstPoint, width * firstPoint.p)\n const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1])\n this.renderLine(context2d, firstPoint, secondPoint, width)\n\n // Possibility to try this (the start looks better when the ink is large)\n // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]);\n // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true);\n\n for (let i = 0; i < NUMBER_QUADRATICS; i++) {\n const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const ctrl: TPointer = stroke.pointers[i + 1]\n this.renderQuadratic(context2d, begin, end, ctrl, width)\n }\n const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1])\n const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderLine(context2d, beginLine, endLine, width)\n\n const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2]\n const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderFinal(context2d, beginFinal, endFinal, width)\n }\n context2d.closePath()\n if (color !== undefined) {\n context2d.fillStyle = color\n context2d.fill()\n }\n context2d.save()\n }\n finally {\n context2d.restore()\n }\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TSymbol } from \"../../@types/renderer/Symbol\"\n\nimport { drawShapeSymbol, ShapeSymbols } from \"./CanvasRendererShapeSymbol\"\nimport { drawStroke } from \"./CanvasRendererStrokeSymbol\"\nimport { drawTextSymbol, TextSymbols } from \"./CanvasRendererTextSymbol\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport class CanvasRenderer\n{\n config: TRenderingConfiguration\n stroker: CanvasStroker\n context!: {\n parent: HTMLElement\n renderingCanvas: HTMLCanvasElement\n renderingCanvasContext: CanvasRenderingContext2D\n capturingCanvas: HTMLCanvasElement\n capturingCanvasContext: CanvasRenderingContext2D\n }\n\n constructor(config: TRenderingConfiguration)\n {\n this.config = config\n this.stroker = new CanvasStroker()\n }\n\n private createCanvas(type: string): HTMLCanvasElement\n {\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\")\n canvas.id = type\n canvas.classList.add(type)\n canvas.classList.add(\"ms-canvas\")\n return canvas\n }\n\n private resizeContent(): void\n {\n const pixelRatio: number = window.devicePixelRatio\n const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas]\n elements.forEach((canvas) =>\n {\n const domElement = canvas.parentNode as HTMLElement\n const width = Math.max(this.config.minWidth, domElement.clientWidth)\n const height = Math.max(this.config.minHeight, domElement.clientHeight)\n canvas.width = width * pixelRatio\n canvas.height = height * pixelRatio\n canvas.getContext(\"2d\")?.scale(pixelRatio, pixelRatio)\n canvas.style.width = `${ width }px`\n canvas.style.height = `${ height }px`\n })\n }\n\n private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n {\n const type = symbol.elementType || symbol.type\n if (type === \"stroke\") {\n drawStroke(context2D, symbol as TStroke, this.stroker)\n } else if (Object.keys(TextSymbols).includes(type)) {\n drawTextSymbol(context2D, symbol)\n } else if (Object.keys(ShapeSymbols).includes(type)) {\n drawShapeSymbol(context2D, symbol)\n }\n }\n\n init(element: HTMLElement): void\n {\n const renderingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-rendering-canvas\")\n element.appendChild(renderingCanvas)\n\n const capturingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-capture-canvas\")\n element.appendChild(capturingCanvas)\n\n this.context = {\n parent: element,\n renderingCanvas,\n renderingCanvasContext: renderingCanvas.getContext(\"2d\") as CanvasRenderingContext2D,\n capturingCanvas,\n capturingCanvasContext: capturingCanvas.getContext(\"2d\") as CanvasRenderingContext2D\n }\n\n this.resizeContent()\n }\n\n drawModel(model: IModel): void\n {\n this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height)\n model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol))\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n }\n\n drawPendingStroke(stroke: TStroke | undefined): void\n {\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n if (stroke && stroke?.pointerType !== \"eraser\") {\n this.stroker.drawStroke(this.context.capturingCanvasContext, stroke)\n }\n }\n\n resize(model: IModel): void\n {\n this.resizeContent()\n this.drawModel(model)\n }\n\n destroy(): void\n {\n if (this.context.parent) {\n this.context.parent.innerHTML = \"\"\n }\n }\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.JsonCSS=e():t.JsonCSS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=1)}([function(t,e,n){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i=function t(e){var n=this;o(this,t),this.toJSON=function(t){if(\"string\"!=typeof t)return console.error(\"Need a CSS string but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid CSS..!\";var e={},o=void 0,i=void 0,u=void 0;try{t.split(\"{\").forEach(function(t){if(i=t.trim())if(-1===i.indexOf(\"}\"))e[i]={},o=i;else{i.substring(0,i.indexOf(\"}\")).split(\";\").forEach(function(t){(u=t.split(\":\"))&&2===u.length&&(e[o][u[0].trim().replace(/^\\\"|\\\"$/g,\"\")]=n._trimSemiColon(u[1].trim().replace(/^\\\"|\\\"$/g,\"\")))});try{o=i.split(\"}\")[1].trim(),o&&(e[o]={})}catch(t){}}})}catch(t){return\"Not a valid CSS..!\"}return e},this.toCSS=function(t){if(\"object\"!==(void 0===t?\"undefined\":r(t)))return console.error(\"Need a JSON object but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid JSON..!\";var e=\"\";try{for(var n in t)if(t.hasOwnProperty(n)){e+=n+\" {\\n\";for(var o in t[n])t[n].hasOwnProperty(o)&&(e+=o+\": \"+t[n][o]+\";\\n\");e+=\"}\\n\"}}catch(t){return\"Not a valid JSON..!\"}return e},this._trimSemiColon=function(t){return\";\"===t.slice(-1)?t.slice(0,n.length-1):t}};e.default=i},function(t,e,n){\"use strict\";t.exports=n(0).default}])});","import JsonCSS from \"json-css\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parser: any = new JsonCSS()\n\nexport default {\n themeToCSS(json: TTheme): string\n {\n return parser.toCSS(json) as string\n // css = css.replace( /[\\r\\n]+/gm, \"\" )\n // return css\n },\n themeToJSON(style: string): TTheme\n {\n const theme = parser.toJSON(style) as TTheme\n theme[\".text\"][\"font-size\"] = Number(theme[\".text\"][\"font-size\"])\n theme.ink[\"-myscript-pen-width\"] = Number(theme.ink[\"-myscript-pen-width\"])\n theme.ink.width = Number(theme.ink.width)\n return theme\n },\n penStyleToCSS (penStyle: TPenStyle): string {\n let css = parser.toCSS({ css: penStyle }) as string\n css = css.substring(6, css.length - 3)\n return css\n },\n penStyleToJSON (penStyleString: string): TPenStyle {\n const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle\n if (penStyle.width) {\n penStyle.width = Number(penStyle.width)\n } else {\n delete penStyle.width\n }\n if (penStyle[\"-myscript-pen-width\"]) {\n penStyle[\"-myscript-pen-width\"] = Number(penStyle[\"-myscript-pen-width\"])\n } else {\n delete penStyle[\"-myscript-pen-width\"]\n }\n return penStyle\n },\n\n stringToJSON(style: string): {[key: string]: string}\n {\n return parser.toJSON(`css {${style}}`).css\n },\n JSONToString(style: {[key: string]: string}): string\n {\n return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(\";\")\n }\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA512;\n\n}));","import Hex from \"crypto-js/enc-hex\"\nimport HmacSHA512 from \"crypto-js/hmac-sha512\"\n\nexport function computeHmac (message: string, applicationKey: string, hmacKey: string): string {\n const hmac = new HmacSHA512(message, applicationKey + hmacKey)\n return hmac.toString(Hex) as string\n}\n","\nexport const isVersionSuperiorOrEqual = (source: string, target: string): boolean =>\n{\n const sourceParts = source.split(\".\")\n const targetParts = target.split(\".\")\n\n for (let i = 0; i < targetParts.length; i++) {\n const a = Number(targetParts[i])\n const b = Number(sourceParts[i])\n if (a > b) return false\n if (a < b) return true\n }\n return true\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TStroke, TStrokeJSON } from \"../@types/model/Stroke\"\nimport { TPointer } from \"../@types/geometry\"\n\nexport class Stroke implements TStroke\n{\n id: string\n type: string\n pointerId: number\n pointerType: string\n elementType?: string\n pointers: TPointer[]\n length: number\n style: TPenStyle\n\n constructor(style: TPenStyle, pointerId: number, pointerType = \"pen\")\n {\n this.id = `${pointerType}-${Date.now().toString()}`\n this.type = \"stroke\"\n this.pointerId = pointerId\n this.pointerType = pointerType\n this.pointers = []\n this.length = 0\n this.style = style\n }\n}\n\nexport function convertStrokeToJSON(stroke: TStroke): TStrokeJSON\n{\n const json: TStrokeJSON = {\n id: stroke.id,\n pointerType: stroke.pointerType,\n p: [],\n t: [],\n x: [],\n y: []\n }\n stroke.pointers.forEach(p => {\n json.p.push(p.p)\n json.t.push(p.t)\n json.x.push(p.x)\n json.y.push(p.y)\n })\n return json\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TRestPostConfiguration, TRestPostData } from \"../@types/recognizer/RestRecognizer\"\nimport { TStrokeGroup, TStrokeGroupJSON } from \"../@types/model/Stroke\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport StyleHelper from \"../style/StyleHelper\"\nimport { computeHmac } from \"./CryptoHelper\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\ntype ApiError = {\n code?: string\n message: string\n}\n\nexport class RestRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n }\n\n get url()\n {\n return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch`\n }\n\n get postConfig(): TRestPostConfiguration\n {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n return {\n lang: this.recognitionConfiguration.lang,\n diagram: this.recognitionConfiguration.diagram,\n export: this.recognitionConfiguration.export\n }\n case \"MATH\":\n return {\n lang: this.recognitionConfiguration.lang,\n math: this.recognitionConfiguration.math,\n export: this.recognitionConfiguration.export\n }\n case \"Raw Content\":\n return {\n lang: this.recognitionConfiguration.lang,\n \"raw-content\": this.recognitionConfiguration[\"raw-content\"],\n export: this.recognitionConfiguration.export\n }\n case \"TEXT\":\n return {\n lang: this.recognitionConfiguration.lang,\n text: this.recognitionConfiguration.text,\n export: this.recognitionConfiguration.export\n }\n default:\n throw new Error(`get postConfig error Recognition type unkow \"${ this.recognitionConfiguration.type }\"`)\n break\n }\n }\n\n private buildData(model: IModel): TRestPostData\n {\n const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) =>\n {\n return ps1[\"-myscript-pen-fill-color\"] === ps2[\"-myscript-pen-fill-color\"] &&\n ps1[\"-myscript-pen-fill-style\"] === ps2[\"-myscript-pen-fill-style\"] &&\n ps1[\"-myscript-pen-width\"] === ps2[\"-myscript-pen-width\"] &&\n ps1.color === ps2.color &&\n ps1.width === ps2.width\n }\n\n const strokeGroupByPenStyle: TStrokeGroup[] = []\n model.rawStrokes.forEach((s) => {\n const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style))\n if (groupIndex > -1) {\n strokeGroupByPenStyle[groupIndex].strokes.push(s)\n } else {\n strokeGroupByPenStyle.push({\n penStyle: s.style,\n strokes: [s]\n })\n }\n })\n\n const strokeGroupsToSend: TStrokeGroupJSON[] = []\n strokeGroupByPenStyle.forEach((group: TStrokeGroup) =>\n {\n const newPenStyle = JSON.stringify(group.penStyle) === \"{}\" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle)\n const newGroup = {\n penStyle: newPenStyle,\n strokes: group.strokes.map(convertStrokeToJSON)\n }\n strokeGroupsToSend.push(newGroup)\n })\n\n const contentType: string = this.recognitionConfiguration.type === \"Raw Content\" ?\n \"Raw Content\" :\n this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase()\n\n return {\n configuration: this.postConfig,\n xDPI: 96,\n yDPI: 96,\n contentType,\n // theme: StyleHelper.themeToCSS(),\n height: model.height,\n width: model.width,\n strokeGroups: strokeGroupsToSend\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async post(data: any, mimeType: string): Promise\n {\n const headers = new Headers()\n headers.append(\"Accept\", \"application/json,\" + mimeType)\n headers.append(\"applicationKey\", this.serverConfiguration.applicationKey)\n headers.append(\"hmac\", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey))\n headers.append(\"Content-Type\", \"application/json\")\n\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n headers.append(\"myscript-client-name\", \"iink-ts\")\n headers.append(\"myscript-client-version\", \"1.0.0-buildVersion\")\n }\n\n const reqInit: RequestInit = {\n method: \"POST\",\n headers,\n body: JSON.stringify(data)\n }\n const request = new Request(this.url, reqInit)\n const response: Response = await fetch(request)\n if (response.ok) {\n const contentType = response.headers.get(\"content-type\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any\n switch (contentType) {\n case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n case \"image/png\":\n case \"image/jpeg\":\n result = await response.blob()\n break\n case \"application/json\":\n result = await response.json()\n break\n case \"application/vnd.myscript.jiix\":\n result = await response.clone().json().catch(async () => await response.text())\n break\n default:\n result = await response.text()\n break\n }\n return result\n } else {\n const err = await response.json() as ApiError\n throw err\n }\n }\n\n private async tryFetch(data: unknown, mimeType: string): Promise\n {\n return this.post(data, mimeType)\n .then((res) =>\n {\n const exports: TExport = {}\n exports[mimeType] = res as TJIIXExport | string | Blob\n return exports\n })\n .catch((err) =>\n {\n let message = err.message || ErrorConst.UNKNOW\n if (!err.code) {\n message = ErrorConst.CANT_ESTABLISH\n } else if (err.code === \"access.not.granted\") {\n message = ErrorConst.WRONG_CREDENTIALS\n }\n const error = new Error(message)\n throw error\n })\n }\n\n private getMimeTypes(requestedMimeTypes?: string[]): string[]\n {\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n break\n }\n }\n return mimeTypes\n }\n\n async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n const myModel = model.getClone()\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n const dataToConcert = this.buildData(myModel)\n dataToConcert.conversionState = conversionState\n const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt))\n const converts: TExport[] = await Promise.all(promises)\n converts.forEach(c =>\n {\n myModel.mergeConvert(c)\n })\n return myModel\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n const myModel = model.getClone()\n if (myModel.rawStrokes.length === 0) {\n return Promise.resolve(myModel)\n }\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n if (!mimeTypes.length) {\n return Promise.reject(new Error(\"Export failed, no mimeTypes define in recognition configuration\"))\n }\n const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m])\n const data = this.buildData(model)\n const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType)))\n exports.forEach(e =>\n {\n myModel.mergeExport(e)\n })\n return myModel\n }\n\n async resize(model: IModel): Promise\n {\n return this.export(model)\n }\n\n}\n","import { IModel } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\n\nexport class UndoRedoContext implements TUndoRedoContext\n{\n canUndo: boolean\n canRedo: boolean\n empty: boolean\n stackIndex: number\n possibleUndoCount: number\n stack: IModel[]\n\n constructor(model: IModel)\n {\n this.stackIndex = 0\n this.possibleUndoCount = 0\n this.canRedo = false\n this.canUndo = false\n this.empty = true\n this.stack = [model.getClone()]\n }\n}\n","import { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { IModel } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { UndoRedoContext } from \"./UndoRedoContext\"\n\nexport class UndoRedoManager\n{\n context: UndoRedoContext\n configuration: TUndoRedoConfiguration\n\n constructor(configuration: TUndoRedoConfiguration, model: IModel)\n {\n this.configuration = configuration\n this.context = new UndoRedoContext(model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n private updateCanUndoRedo(): void\n {\n this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex\n this.context.canUndo = this.context.stackIndex > 0\n const currentModel = this.context.stack[this.context.stackIndex]\n this.context.empty = currentModel.rawStrokes.length === 0\n }\n\n addModelToStack(model: IModel): void\n {\n if (this.context.stackIndex + 1 < this.context.stack.length) {\n this.context.stack.splice(this.context.stackIndex + 1)\n }\n\n this.context.stackIndex++\n this.context.stack.push(model.getClone())\n\n if (this.context.stack.length > this.configuration.maxStackSize) {\n this.context.stack.shift()\n this.context.stackIndex--\n }\n\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n\n removeLastModelInStack(): void\n {\n if (this.context.stackIndex === this.context.stack.length - 1) {\n this.context.stackIndex--\n }\n this.context.stack.pop()\n this.updateCanUndoRedo()\n }\n\n updateModelInStack(model: IModel): void\n {\n const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate)\n if (index > -1) {\n this.context.stack.splice(index, 1, model.getClone())\n }\n this.internalEvent.emitContextChange(this.context)\n }\n\n undo(): IModel\n {\n if (this.context.canUndo) {\n this.context.stackIndex--\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n return this.context.stack[this.context.stackIndex].getClone()\n }\n\n redo(): IModel\n {\n if (this.context.canRedo) {\n this.context.stackIndex++\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n return this.context.stack[this.context.stackIndex].getClone()\n }\n\n reset(model: IModel): void\n {\n this.context = new UndoRedoContext(model)\n this.internalEvent.emitContextChange(this.context)\n }\n\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const mergeDeep = (target: any, ...sources: any[]): any =>\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isObject = (item: any) =>\n {\n return (item && typeof item === \"object\" && !Array.isArray(item))\n }\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n mergeDeep(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return mergeDeep(target, ...sources)\n }","import { TPenStyle } from \"../@types/style/PenStyle\"\n\nexport const DefaultPenStyle: TPenStyle = {}","import { TTheme } from \"../@types/style/Theme\"\n\nexport const DefaultTheme: TTheme = {\n ink: {\n color: \"#000000\",\n width: 1,\n \"-myscript-pen-width\": 1,\n \"-myscript-pen-fill-style\": \"none\",\n \"-myscript-pen-fill-color\": \"#FFFFFF00\"\n },\n \".math\": {\n \"font-family\": \"STIXGeneral\"\n },\n \".math-solved\": {\n \"font-family\": \"STIXGeneral\",\n color: \"#A8A8A8FF\"\n },\n \".text\": {\n \"font-family\": \"MyScriptInter\",\n \"font-size\": 10\n }\n}\n","import { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nimport { DefaultPenStyle } from \"./DefaultPenStyle\"\nimport { DefaultTheme } from \"./DefaultTheme\"\n\nexport class StyleManager\n{\n #penStyle!: TPenStyle\n #theme!: TTheme\n #penStyleClasses!: string\n #currentPenStyle!: TPenStyle\n\n constructor(penStyle?: TPenStyle, theme?: TTheme)\n {\n this.setTheme(theme)\n this.setPenStyleClasses()\n this.setPenStyle(penStyle)\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.#currentPenStyle || this.#penStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.#penStyle\n }\n setPenStyle(p?: TPenStyle)\n {\n\n this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), p || {}) as TPenStyle\n this.#currentPenStyle = p || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n }\n\n get theme(): TTheme\n {\n return this.#theme\n }\n setTheme(t?: TTheme)\n {\n this.#theme = mergeDeep(structuredClone(DefaultTheme), t || {}) as TTheme\n }\n\n get penStyleClasses(): string\n {\n return this.#penStyleClasses\n }\n setPenStyleClasses(psc = \"\")\n {\n this.#penStyleClasses = psc\n this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n }\n\n}\n","import { TConfiguration } from \"../@types/Configuration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\n\nexport const DefaultServerConfiguration: TServerConfiguration = {\n protocol: \"WEBSOCKET\",\n scheme: \"https\",\n host: \"cloud.myscript.com\",\n applicationKey: \"\",\n hmacKey: \"\",\n version: \"2.1.0\",\n useWindowLocation: false,\n websocket: {\n pingEnabled: true,\n pingDelay: 30000,\n maxPingLostCount: 10,\n autoReconnect: true,\n maxRetryCount: 2,\n fileChunkSize: 300000\n }\n}\n\nexport const DefaultRecognitionConfiguration: TRecognitionConfiguration = {\n type: \"TEXT\",\n alwaysConnected: true,\n lang: \"en_US\",\n gesture: {\n enable: true\n },\n export: {\n \"image-resolution\": 300,\n jiix: {\n \"bounding-box\": false,\n strokes: false,\n text: {\n chars: false,\n words: true\n }\n },\n },\n renderer: {\n debug: {\n \"draw-text-boxes\": false,\n \"draw-image-boxes\": false\n }\n },\n math: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/mathml+xml\", \"application/x-latex\" ,\n solver: {\n enable: true,\n \"fractional-part-digits\": 3,\n \"decimal-separator\": \".\",\n \"rounding-mode\": \"half up\",\n \"angle-unit\": \"deg\"\n },\n margin: {\n bottom: 10,\n left: 15,\n right: 15,\n top: 10\n },\n eraser: {\n \"erase-precisely\": false\n },\n \"undo-redo\": {\n mode: \"stroke\"\n }\n },\n text: {\n guides: {\n enable: true\n },\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"text/plain\"\n margin: {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n },\n eraser: {\n \"erase-precisely\": false\n }\n },\n diagram: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n eraser: {\n \"erase-precisely\": false\n },\n convert: {\n \"match-text-size\": true\n }\n },\n \"raw-content\": {\n recognition: {\n text: true,\n shape: true\n },\n eraser: {\n \"erase-precisely\": false\n }\n }\n}\n\nexport const DefaultGrabberConfiguration: TGrabberConfiguration = {\n listenerOptions: {\n capture: false,\n passive: true\n },\n xyFloatPrecision: 0,\n timestampFloatPrecision: 0\n}\n\nexport const DefaultRenderingConfiguration: TRenderingConfiguration = {\n minHeight: 100,\n minWidth: 100,\n smartGuide: {\n enable: true,\n fadeOut: {\n enable: false,\n duration: 5000\n }\n },\n guides: {\n enable: true,\n gap: 50\n }\n}\n\nexport const DefaultTriggerConfiguration: TTriggerConfiguration = {\n exportContent: \"POINTER_UP\",\n exportContentDelay: 1000,\n resizeTriggerDelay: 100\n}\n\nexport const DefaultEventsConfiguration: TEventConfiguration = {\n processDelay: 10\n}\n\nexport const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = {\n maxStackSize: 100\n}\n\nexport const DefaultConfiguration: TConfiguration = {\n server: DefaultServerConfiguration,\n recognition: DefaultRecognitionConfiguration,\n grabber: DefaultGrabberConfiguration,\n rendering: DefaultRenderingConfiguration,\n triggers: DefaultTriggerConfiguration,\n events: DefaultEventsConfiguration,\n \"undo-redo\": DefaultUndoRedoConfiguration\n}\n","\nimport { TConfiguration, TConfigurationClient } from \"../@types/Configuration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { DefaultConfiguration } from \"./DefaultConfiguration\"\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nexport class Configuration implements TConfiguration\n{\n events: TEventConfiguration\n grabber: TGrabberConfiguration\n recognition: TRecognitionConfiguration\n rendering: TRenderingConfiguration\n server: TServerConfiguration\n triggers: TTriggerConfiguration\n \"undo-redo\": TUndoRedoConfiguration\n\n constructor(configuration?: TConfigurationClient)\n {\n this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events))\n this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber))\n this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition))\n this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering))\n this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server))\n this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers))\n\n this.overrideDefaultConfiguration(configuration)\n }\n\n\n\n overrideDefaultConfiguration(configuration?: TConfigurationClient): void\n {\n const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration))\n this.events = mergeDeep({}, defaultConf.events, configuration?.events)\n this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber)\n this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition)\n this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering)\n this.server = mergeDeep({}, defaultConf.server, configuration?.server)\n this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers)\n this[\"undo-redo\"] = mergeDeep({}, defaultConf[\"undo-redo\"], configuration?.[\"undo-redo\"])\n\n this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes\n this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes\n this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes\n\n if (this.server?.useWindowLocation) {\n this.server.scheme = window.location.protocol.indexOf(\"s\") > -1 ? \"https\" : \"http\"\n this.server.host = window.location.host\n }\n\n if (\n this.server.protocol === \"REST\" &&\n this.triggers.exportContent === \"POINTER_UP\"\n ) {\n this.triggers.exportContent = \"QUIET_PERIOD\"\n this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50)\n }\n\n if (\n this.server.protocol === \"WEBSOCKET\" &&\n this.recognition.type === \"TEXT\"\n ) {\n if (\n this.rendering.smartGuide.enable &&\n !this.recognition.text.mimeTypes.includes(\"application/vnd.myscript.jiix\")\n ) {\n // mimeType required for smartGuide\n this.recognition.text.mimeTypes.push(\"application/vnd.myscript.jiix\")\n }\n } else {\n // smartGuide enable only on websocket text\n this.rendering.smartGuide.enable = false\n }\n }\n}\n","import { TPoint } from \"../@types/geometry\"\n\nexport function computeDistance(p1: TPoint, p2: TPoint): number\n{\n const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x)\n return isNaN(distance) ? 0 : distance\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPoint, TPointer } from \"../@types/geometry\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TRecognitionPositions } from \"../@types/model/RecognitionPositions\"\n\nimport { computeDistance } from \"../utils/geometric\"\nimport { Stroke } from \"./Stroke\"\n\nexport class Model implements IModel\n{\n readonly creationTime: number\n modificationDate: number\n currentStroke?: TStroke\n positions: TRecognitionPositions\n rawStrokes: TStroke[]\n selectedStrokes: TStroke[]\n exports?: TExport\n converts?: TExport\n width: number\n height: number\n idle: boolean\n\n constructor(width = 100, height = 100, creationDate: number = Date.now())\n {\n this.creationTime = creationDate\n this.modificationDate = creationDate\n this.width = width\n this.height = height\n this.rawStrokes = []\n this.selectedStrokes = []\n this.positions = {\n lastSentPosition: 0,\n lastReceivedPosition: 0\n }\n this.idle = true\n }\n\n mergeExport(exports: TExport)\n {\n if (this.exports) {\n Object.assign(this.exports, exports)\n } else {\n this.exports = exports\n }\n }\n\n mergeConvert(converts: TExport)\n {\n if (this.converts) {\n Object.assign(this.converts, converts)\n } else {\n this.converts = converts\n }\n }\n\n private computePressure(distance: number, globalDistance: number): number\n {\n let ratio = 1.0\n if (globalDistance === 0) {\n ratio = 0.5\n } else if (distance === globalDistance) {\n ratio = 1.0\n } else if (distance < 10) {\n ratio = 0.2 + Math.pow(0.1 * distance, 0.4)\n } else if (distance > globalDistance - 10) {\n ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4)\n }\n const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance)))\n return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100\n }\n\n private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean\n {\n const delta: number = (2 + ((stroke.style[\"-myscript-pen-width\"] || 0) / 4))\n return !lastPointer ||\n stroke.pointers.length === 0 ||\n Math.abs(lastPointer.x - point.x) >= delta ||\n Math.abs(lastPointer.y - point.y) >= delta\n }\n\n addPoint(stroke: TStroke, pointer: TPointer): void\n {\n const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 }\n if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) {\n const distance = computeDistance(pointer, lastPointer)\n stroke.length += distance\n pointer.p = this.computePressure(distance, stroke.length)\n stroke.pointers.push(pointer)\n }\n }\n\n addStroke(stroke: TStroke): void\n {\n this.rawStrokes.push(stroke)\n }\n\n extractUnsentStrokes(): TStroke[]\n {\n return this.rawStrokes.slice(this.positions.lastSentPosition)\n }\n\n initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void\n {\n if (style[\"-myscript-pen-width\"]) {\n const pxWidth = (style[\"-myscript-pen-width\"] * dpi) / 25.4\n style.width = pxWidth / 2\n }\n this.modificationDate = Date.now()\n this.exports = undefined\n this.converts = undefined\n this.currentStroke = new Stroke(style, pointerId, pointerType)\n this.addPoint(this.currentStroke, point)\n }\n\n appendToCurrentStroke(point: TPointer): void\n {\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n }\n }\n\n endCurrentStroke(point: TPointer): void\n {\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n this.addStroke(this.currentStroke)\n this.currentStroke = undefined\n }\n }\n\n #getStrokeFromPoint(point: TPoint): TStroke[]\n {\n const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max)\n\n const _strokeList: TStroke[] = []\n this.rawStrokes.forEach((stroke) =>\n {\n for (let i = 0; i < stroke.pointers.length; i++) {\n const strokePointer = stroke.pointers[i]\n if (\n isBetween(strokePointer.x, point.x - 5, point.x + 5) &&\n isBetween(strokePointer.y, point.y - 5, point.y + 5)\n ) {\n _strokeList.push(stroke)\n break\n }\n else {\n if (computeDistance(point, strokePointer) < 10) {\n _strokeList.push(stroke)\n break\n }\n }\n }\n })\n return _strokeList\n }\n\n resetSelectedStrokes(): void\n {\n this.selectedStrokes = []\n }\n\n appendSelectedStrokesFromPoint(point: TPoint): void\n {\n this.#getStrokeFromPoint(point)\n .forEach(s =>\n {\n if (!this.selectedStrokes.includes(s)) {\n this.selectedStrokes.push(s)\n }\n })\n }\n\n updateStroke(updatedStroke: TStroke): void\n {\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1, updatedStroke)\n }\n }\n\n removeStroke(id: string): void\n {\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1)\n }\n }\n\n removeStrokesFromPoint(point: TPoint): string[]\n {\n const strokes = this.#getStrokeFromPoint(point)\n strokes.forEach(strokeToRemove =>\n {\n this.removeStroke(strokeToRemove.id)\n })\n return strokes.map(s => s.id)\n }\n\n updatePositionSent(position: number = this.rawStrokes.length): void\n {\n this.positions.lastSentPosition = position\n }\n\n updatePositionReceived(): void\n {\n this.positions.lastReceivedPosition = this.positions.lastSentPosition\n }\n\n getClone(): IModel\n {\n const clonedModel = new Model(this.width, this.height, this.creationTime)\n clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate))\n clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined\n clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes))\n clonedModel.positions = JSON.parse(JSON.stringify(this.positions))\n clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined\n clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined\n clonedModel.idle = this.idle\n return clonedModel\n }\n\n clear(): void\n {\n this.modificationDate = Date.now()\n this.currentStroke = undefined\n this.rawStrokes = []\n this.positions.lastSentPosition = 0\n this.positions.lastReceivedPosition = 0\n this.exports = undefined\n this.converts = undefined\n this.idle = true\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TConfiguration } from \"../@types/Configuration\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { CanvasRenderer } from \"../renderer/canvas/CanvasRenderer\"\nimport { RestRecognizer } from \"../recognizer/RestRecognizer\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { UndoRedoManager } from \"../undo-redo/UndoRedoManager\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { ModeInteraction } from \"../Constants\"\n\nexport class RestBehaviors implements IBehaviors\n{\n name = \"RestBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: CanvasRenderer\n recognizer: RestRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n mode: ModeInteraction\n\n #resizeTimer?: ReturnType\n #exportTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new CanvasRenderer(this.#configuration.rendering)\n this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.mode = ModeInteraction.Writing\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(ps?: TPenStyle)\n {\n this.styleManager.setPenStyle(ps)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(psc?: string)\n {\n this.styleManager.setPenStyleClasses(psc)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(t?: TTheme)\n {\n this.styleManager.setTheme(t)\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n const { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n switch (this.mode) {\n case ModeInteraction.Erasing:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(model => Object.assign(this.model, model))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n default:\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n break\n }\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n switch (this.mode) {\n case ModeInteraction.Erasing:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n default:\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n break\n }\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n switch (this.mode) {\n case ModeInteraction.Erasing:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n default:\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n break\n }\n }\n\n drawCurrentStroke(): void\n {\n this.renderer.drawPendingStroke(this.model.currentStroke)\n }\n\n async updateModelRendering(): Promise\n {\n this.renderer.drawModel(this.model)\n const deferred = new DeferredPromise()\n this.undoRedoManager.addModelToStack(this.model)\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n clearTimeout(this.#exportTimer)\n let currentModel = this.model.getClone()\n this.#exportTimer = setTimeout(async () =>\n {\n try {\n currentModel = await this.recognizer.export(currentModel)\n this.undoRedoManager.updateModelInStack(currentModel)\n if (this.model.modificationDate === currentModel.modificationDate) {\n this.model.exports = currentModel.exports\n }\n deferred.resolve(this.model)\n } catch (error) {\n deferred.reject(error as Error)\n }\n }, this.#configuration.triggers.exportContent === \"QUIET_PERIOD\" ? this.#configuration.triggers.exportContentDelay : 0)\n } else {\n deferred.resolve(this.model)\n }\n await deferred.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n return deferred.promise\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes)\n if (this.model.modificationDate === newModel.modificationDate) {\n this.model.mergeExport(newModel.exports as TExport)\n }\n this.undoRedoManager.updateModelInStack(newModel)\n return this.model\n }\n\n async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes)\n Object.assign(this.#model, newModel)\n return this.model\n }\n\n async resize(height: number, width: number): Promise\n {\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n this.renderer.resize(this.model)\n if (this.model.rawStrokes.length) {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n const resizeModel = await this.recognizer.resize(this.model)\n deferredResize.resolve(resizeModel)\n }, this.#configuration.triggers.resizeTriggerDelay)\n } else {\n deferredResize.resolve(this.model)\n }\n const newModel = await deferredResize.promise\n this.internalEvent.emitExported(newModel.exports as TExport)\n return newModel\n }\n\n async undo(): Promise\n {\n this.#model = this.undoRedoManager.undo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n return this.#model\n }\n\n async redo(): Promise\n {\n this.#model = this.undoRedoManager.redo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n return this.#model\n }\n\n async clear(): Promise\n {\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.drawModel(this.model)\n this.internalEvent.emitExported(this.model.exports as TExport)\n return this.model\n }\n\n async destroy(): Promise\n {\n this.grabber.detach()\n this.renderer.destroy()\n return Promise.resolve()\n }\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { computeHmac } from \"./CryptoHelper\"\nimport StyleHelper from \"../style/StyleHelper\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\n/**\n * A websocket dialog have this sequence :\n * --------------------------- Client --------------------------------------------------- Server ----------------------------------\n * init: send newContentPackage or restoreIInkSession ==================>\n * <================== hmacChallenge\n * answer hmacChallenge: send the hmac ==================>\n * <================== contentPackageDescription\n * answer contentPackageDescription:\n * send the configuration ==================>\n * send newContentPart or openContentPart ==================>\n * <================== partChanged\n * <================== contentChanged\n * <================== newPart\n * <================== svgPatch\n *\n * setPenStyle (send the parameters) ==================>\n * setTheme (send the parameters) ==================>\n * setPenStyleClasses (send the parameters) ==================>\n * <================== svgPatch\n * addStrokes (send the strokes ) ============>\n * <================== update\n */\nexport class WSRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n protected socket!: WebSocket\n protected pingCount = 0\n protected reconnectionCount = 0\n protected viewSizeHeight!: number\n protected viewSizeWidth!: number\n // contentPartCount = 0\n protected sessionId?: string\n protected currentPartId?: string\n protected currentErrorCode?: string | number\n\n protected penStyle?: TPenStyle\n protected penStyleClasses?: string\n protected theme?: TTheme\n\n protected connected?: DeferredPromise\n protected initialized?: DeferredPromise\n protected addStrokeDeferred?: DeferredPromise\n protected exportDeferred?: DeferredPromise\n protected convertDeferred?: DeferredPromise\n protected importDeferred?: DeferredPromise\n protected resizeDeferred?: DeferredPromise\n protected undoDeferred?: DeferredPromise\n protected redoDeferred?: DeferredPromise\n protected clearDeferred?: DeferredPromise\n protected importPointEventsDeferred?: DeferredPromise\n protected waitForIdleDeferred?: DeferredPromise\n\n url: string\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n const scheme = (this.serverConfiguration.scheme === \"https\") ? \"wss\" : \"ws\"\n this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }`\n }\n\n get mimeTypes(): string[]\n {\n switch (this.recognitionConfiguration.type.toLocaleLowerCase()) {\n case \"text\":\n return this.recognitionConfiguration.text.mimeTypes\n case \"math\":\n return this.recognitionConfiguration.math.mimeTypes\n case \"diagram\":\n return this.recognitionConfiguration.diagram.mimeTypes\n default:\n //\"raw-content\"\n return []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n protected infinitePing(): void\n {\n this.pingCount++\n if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) {\n this.socket.close(1000, \"PING_LOST\")\n } else if (this.socket.readyState <= 1) {\n setTimeout(() =>\n {\n if (this.socket.readyState <= 1) {\n this.socket.send(JSON.stringify({ type: \"ping\" }))\n this.infinitePing()\n }\n }, this.serverConfiguration.websocket.pingDelay)\n }\n }\n\n protected openCallback(): void\n {\n this.connected?.resolve()\n const params: TWebSocketEvent = {\n type: this.sessionId ? \"restoreIInkSession\" : \"newContentPackage\",\n iinkSessionId: this.sessionId,\n applicationKey: this.serverConfiguration.applicationKey,\n xDpi: 96,\n yDpi: 96,\n viewSizeHeight: this.viewSizeHeight,\n viewSizeWidth: this.viewSizeWidth\n }\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n params[\"myscript-client-name\"] = \"iink-ts\"\n params[\"myscript-client-version\"] = \"1.0.0-buildVersion\"\n }\n this.send(params)\n }\n\n protected rejectDeferredPending(error: Error): void\n {\n if (this.connected?.isPending) {\n this.connected?.reject(error)\n }\n if (this.initialized?.isPending) {\n this.initialized?.reject(error)\n }\n if (this.addStrokeDeferred?.isPending) {\n this.addStrokeDeferred?.reject(error)\n }\n if (this.exportDeferred?.isPending) {\n this.exportDeferred?.reject(error)\n }\n if (this.convertDeferred?.isPending) {\n this.convertDeferred?.reject(error)\n }\n if (this.importDeferred?.isPending) {\n this.importDeferred?.reject(error)\n }\n if (this.resizeDeferred?.isPending) {\n this.resizeDeferred?.reject(error)\n }\n if (this.undoDeferred?.isPending) {\n this.undoDeferred?.reject(error)\n }\n if (this.redoDeferred?.isPending) {\n this.redoDeferred?.reject(error)\n }\n if (this.clearDeferred?.isPending) {\n this.clearDeferred.reject(error)\n }\n if (this.waitForIdleDeferred?.isPending) {\n this.waitForIdleDeferred.reject(error)\n }\n }\n\n protected closeCallback(evt: CloseEvent): void\n {\n let message = \"\"\n if (!this.currentErrorCode) {\n switch (evt.code) {\n case 1000:\n // Normal Closure\n break\n case 1001:\n message = ErrorConst.GOING_AWAY\n break\n case 1002:\n message = ErrorConst.PROTOCOL_ERROR\n break\n case 1003:\n message = ErrorConst.UNSUPPORTED_DATA\n break\n case 1006:\n message = ErrorConst.ABNORMAL_CLOSURE\n break\n case 1007:\n message = ErrorConst.INVALID_FRAME_PAULOAD\n break\n case 1008:\n message = ErrorConst.POLICY_VIOLATION\n break\n case 1009:\n message = ErrorConst.MESSAGE_TOO_BIG\n break\n case 1011:\n message = ErrorConst.INTERNAL_ERROR\n break\n case 1012:\n message = ErrorConst.SERVICE_RESTART\n break\n case 1013:\n message = ErrorConst.TRY_AGAIN\n break\n case 1014:\n message = ErrorConst.BAD_GATEWAY\n break\n case 1015:\n message = ErrorConst.TLS_HANDSHAKE\n break\n default:\n message = ErrorConst.CANT_ESTABLISH\n break\n }\n }\n const error = new Error(message || evt.reason)\n\n this.rejectDeferredPending(error)\n\n if (!this.currentErrorCode && evt.code !== 1000) {\n this.internalEvent.emitError(error)\n }\n }\n\n protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void\n {\n const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent\n if (hmacChallengeMessage.hmacChallenge) {\n this.send({\n type: \"hmac\",\n hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)\n })\n }\n if (hmacChallengeMessage.iinkSessionId) {\n this.sessionId = hmacChallengeMessage.iinkSessionId\n }\n }\n\n protected manageContentPackageDescriptionMessage(): void\n {\n this.reconnectionCount = 0\n\n this.send({ ...this.recognitionConfiguration, type: \"configuration\" })\n\n if (this.currentPartId) {\n this.send({ type: \"openContentPart\", id: this.currentPartId, mimeTypes: this.mimeTypes })\n }\n else {\n this.send({ type: \"newContentPart\", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes })\n }\n }\n\n protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent\n this.currentPartId = partChangeMessage.partId\n this.initialized?.resolve()\n }\n\n protected manageExportMessage(websocketMessage: TWebSocketEvent): void\n {\n const exportMessage = websocketMessage as TWebSocketExportEvent\n if (exportMessage.exports[\"application/vnd.myscript.jiix\"]) {\n exportMessage.exports[\"application/vnd.myscript.jiix\"] = JSON.parse(exportMessage.exports[\"application/vnd.myscript.jiix\"].toString()) as TJIIXExport\n }\n this.initialized?.resolve()\n this.addStrokeDeferred?.resolve(exportMessage.exports)\n this.exportDeferred?.resolve(exportMessage.exports)\n this.convertDeferred?.resolve(exportMessage.exports)\n this.importDeferred?.resolve(exportMessage.exports)\n this.undoDeferred?.resolve(exportMessage.exports)\n this.redoDeferred?.resolve(exportMessage.exports)\n this.clearDeferred?.resolve(exportMessage.exports)\n this.importPointEventsDeferred?.resolve(exportMessage.exports)\n this.internalEvent.emitExported(exportMessage.exports)\n }\n\n protected async manageWaitForIdle(): Promise {\n this.internalEvent.emitIdle(true)\n this.waitForIdleDeferred?.resolve()\n }\n\n protected manageErrorMessage(websocketMessage: TWebSocketEvent): void\n {\n const err = websocketMessage as TWebSocketErrorEvent\n this.currentErrorCode = err.data?.code || err.code\n let message = err.data?.message || err.message || ErrorConst.UNKNOW\n\n switch (this.currentErrorCode) {\n case \"no.activity\":\n message = ErrorConst.NO_ACTIVITY\n break\n case \"access.not.granted\":\n message = ErrorConst.WRONG_CREDENTIALS\n break\n case \"session.too.old\":\n message = ErrorConst.TOO_OLD\n break\n }\n const error = new Error(message)\n this.rejectDeferredPending(error)\n this.internalEvent.emitError(error)\n }\n\n protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent\n const context: TUndoRedoContext = {\n canRedo: contentChangeMessage.canRedo,\n canUndo: contentChangeMessage.canUndo,\n empty: contentChangeMessage.empty,\n stackIndex: contentChangeMessage.undoStackIndex,\n possibleUndoCount: contentChangeMessage.possibleUndoCount,\n stack: []\n }\n this.internalEvent.emitContextChange(context)\n }\n\n protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void\n {\n this.resizeDeferred?.resolve()\n const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent\n this.internalEvent.emitSVGPatch(svgPatchMessage)\n }\n\n protected messageCallback(message: MessageEvent): void\n {\n this.currentErrorCode = undefined\n const websocketMessage: TWebSocketEvent = JSON.parse(message.data)\n if (websocketMessage.type !== \"pong\") {\n this.pingCount = 0\n switch (websocketMessage.type) {\n case \"ack\":\n this.manageHMACChallengeMessage(websocketMessage)\n break\n case \"contentPackageDescription\":\n this.manageContentPackageDescriptionMessage()\n break\n case \"partChanged\":\n this.managePartChangeMessage(websocketMessage)\n break\n case \"newPart\":\n this.initialized?.resolve()\n break\n case \"contentChanged\":\n this.manageContentChangeMessage(websocketMessage)\n break\n case \"exported\":\n this.manageExportMessage(websocketMessage)\n break\n case \"svgPatch\":\n this.manageSVGPatchMessage(websocketMessage)\n break\n case \"error\":\n this.manageErrorMessage(websocketMessage)\n break\n case \"idle\":\n this.manageWaitForIdle()\n break\n // case \"supportedImportMimeTypes\":\n // recognizerContext.supportedImportMimeTypes = message.data.mimeTypes\n // recognitionContext.response(undefined, message.data)\n // break\n // case \"fileChunkAck\":\n // this.importDeferred?.resolve((websocketMessage as unknown) as TExport)\n // break\n // case \"idle\":\n // recognizerContext.idle = true\n // recognitionContext.patch(undefined, message.data)\n // break\n // default :\n // logger.warn(\"This is something unexpected in current recognizer. Not the type of message we should have here.\", message)\n }\n }\n }\n\n async init(height: number, width: number): Promise\n {\n try {\n this.destroy()\n this.connected = new DeferredPromise()\n this.initialized = new DeferredPromise()\n this.viewSizeHeight = height\n this.viewSizeWidth = width\n this.pingCount = 0\n this.socket = new WebSocket(this.url)\n\n if (this.serverConfiguration.websocket.pingEnabled) {\n this.infinitePing()\n }\n\n this.socket.addEventListener(\"open\", this.openCallback.bind(this))\n this.socket.addEventListener(\"close\", this.closeCallback.bind(this))\n this.socket.addEventListener(\"message\", this.messageCallback.bind(this))\n\n return this.initialized.promise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n const error = new Error(ErrorConst.CANT_ESTABLISH)\n this.internalEvent.emitError(error)\n this.initialized?.reject(error)\n return this.initialized?.promise\n }\n }\n\n async send(message: TWebSocketEvent): Promise\n {\n if (!this.connected) {\n return Promise.reject(new Error(\"Recognizer must be initilized\"))\n }\n await this.connected.promise\n if (this.socket.readyState === this.socket.OPEN) {\n this.socket.send(JSON.stringify(message))\n return Promise.resolve()\n } else {\n if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) {\n this.reconnectionCount++\n if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) {\n this.internalEvent.emitClearMessage()\n await this.init(this.viewSizeHeight, this.viewSizeWidth)\n this.setPenStyle(this.penStyle as TPenStyle)\n this.setPenStyleClasses(this.penStyleClasses as string)\n this.setTheme(this.theme as TTheme)\n return this.send(message)\n }\n else {\n return Promise.reject(new Error(\"Unable to send message. The maximum number of connection attempts has been reached.\"))\n }\n }\n }\n }\n\n async addStrokes(model: IModel): Promise\n {\n await this.initialized?.promise\n this.addStrokeDeferred = new DeferredPromise()\n const strokes: TStroke[] = model.extractUnsentStrokes()\n model.updatePositionSent()\n const localModel = model.getClone()\n if (strokes.length === 0) {\n this.addStrokeDeferred.resolve({} as TExport)\n return localModel\n }\n await this.send({\n type: \"addStrokes\",\n strokes: strokes.map(convertStrokeToJSON)\n })\n const exports = await this.addStrokeDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n return localModel\n }\n\n async setPenStyle(penStyle: TPenStyle): Promise\n {\n await this.initialized?.promise\n this.penStyle = penStyle\n const message: TWebSocketEvent = {\n type: \"setPenStyle\",\n style: StyleHelper.penStyleToCSS(penStyle)\n }\n return this.send(message)\n }\n\n async setPenStyleClasses(penStyleClasses: string): Promise\n {\n await this.initialized?.promise\n this.penStyleClasses = penStyleClasses\n const message: TWebSocketEvent = {\n type: \"setPenStyleClasses\",\n styleClasses: penStyleClasses\n }\n return this.send(message)\n }\n\n async setTheme(theme: TTheme): Promise\n {\n await this.initialized?.promise\n this.theme = theme\n const message: TWebSocketEvent = {\n type: \"setTheme\",\n theme: StyleHelper.themeToCSS(theme)\n }\n return this.send(message)\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n await this.initialized?.promise\n this.exportDeferred = new DeferredPromise()\n const localModel = model.getClone()\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n }\n }\n\n if (!mimeTypes.length) {\n return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`))\n }\n\n const message: TWebSocketEvent = {\n type: \"export\",\n partId: this.currentPartId,\n mimeTypes\n }\n await this.send(message)\n const exports: TExport = await this.exportDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n return localModel\n }\n\n async import(model: IModel, data: Blob, mimeType?: string): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n const chunkSize = this.serverConfiguration.websocket.fileChunkSize\n const importFileId = Math.random().toString(10).substring(2, 6)\n this.importDeferred = new DeferredPromise()\n const readBlob = (blob: Blob): Promise =>\n {\n const fileReader = new FileReader()\n return new Promise((resolve, reject) =>\n {\n fileReader.onloadend = (ev) => resolve(ev.target?.result as string)\n fileReader.onerror = () => reject()\n fileReader.readAsText(blob)\n })\n }\n\n const importFileMessage: TWebSocketEvent = {\n type: \"importFile\",\n importFileId,\n mimeType\n }\n await this.send(importFileMessage)\n for (let i = 0; i < data.size; i += chunkSize) {\n const blobPart = data.slice(i, i + chunkSize, data.type)\n const partFileString = await readBlob(blobPart)\n const fileChuckMessage: TWebSocketEvent = {\n type: \"fileChunk\",\n importFileId,\n data: partFileString,\n lastChunk: i + chunkSize > data.size\n }\n await this.send(fileChuckMessage)\n }\n const exports = await this.importDeferred?.promise\n this.importDeferred = undefined\n localModel.mergeExport(exports)\n return localModel\n }\n\n async resize(model: IModel): Promise\n {\n await this.initialized?.promise\n this.resizeDeferred = new DeferredPromise()\n const localModel = model.getClone()\n this.viewSizeHeight = localModel.height\n this.viewSizeWidth = localModel.width\n const message: TWebSocketEvent = {\n type: \"changeViewSize\",\n height: this.viewSizeHeight,\n width: this.viewSizeWidth,\n }\n await this.send(message)\n await this.resizeDeferred?.promise\n return localModel\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n await this.initialized?.promise\n this.importPointEventsDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"pointerEvents\",\n events: strokes.map(convertStrokeToJSON)\n }\n this.send(message)\n\n const exportPoints = await this.importPointEventsDeferred?.promise\n this.importPointEventsDeferred = undefined\n return exportPoints as TExport\n }\n\n async convert(model: IModel, conversionState?: TConverstionState): Promise\n {\n await this.initialized?.promise\n this.convertDeferred = new DeferredPromise()\n const localModel = model.getClone()\n const message: TWebSocketEvent = {\n type: \"convert\",\n conversionState\n }\n await this.send(message)\n const myExportConverted: TExport = await this.convertDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeConvert(myExportConverted)\n localModel.mergeExport(myExportConverted)\n return localModel\n }\n\n async waitForIdle(): Promise\n {\n await this.initialized?.promise\n this.waitForIdleDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"waitForIdle\",\n }\n await this.send(message)\n return this.waitForIdleDeferred?.promise\n }\n\n async undo(model: IModel): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n this.undoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"undo\",\n }\n await this.send(message)\n const undoExports = await this.undoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(undoExports)\n this.undoDeferred = undefined\n return localModel\n }\n\n async redo(model: IModel): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n this.redoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"redo\",\n }\n await this.send(message)\n const redoExports = await this.redoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(redoExports)\n this.redoDeferred = undefined\n return localModel\n }\n\n async clear(model: IModel): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n localModel.modificationDate = Date.now()\n this.clearDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"clear\",\n }\n await this.send(message)\n const clearExports = await this.clearDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(clearExports)\n this.clearDeferred = undefined\n return localModel\n }\n\n close(code: number, reason: string): void\n {\n if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.socket.close(code, reason)\n }\n }\n\n destroy(): void\n {\n this.connected = undefined\n this.initialized = undefined\n this.addStrokeDeferred = undefined\n this.exportDeferred = undefined\n this.convertDeferred = undefined\n this.importDeferred = undefined\n this.resizeDeferred = undefined\n this.undoDeferred = undefined\n this.redoDeferred = undefined\n this.clearDeferred = undefined\n if (this.socket) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.close(1000, \"Recognizer destroyed\")\n }\n }\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class SVGStroker\n{\n\n private getArcPath(center: TPointer, radius: number): string\n {\n const svgPath = [\n `M ${ center.x },${ center.y }`,\n `m ${ -radius },0`,\n `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`,\n `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0`\n ].join(\" \")\n return svgPath\n }\n\n private getLinePath(begin: TPointer, end: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `L ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private getFinalPath(begin: TPointer, end: TPointer, width: number): string\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`]\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - (i * (Math.PI / ARCSPLIT))\n parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`)\n }\n const svgPath = parts.join(\" \")\n return svgPath\n }\n\n private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width)\n const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private buildSVGPath(stroke: TStroke): string\n {\n const STROKE_LENGTH = stroke.pointers.length\n const STROKE_WIDTH = (stroke.style.width as number)\n const NB_QUADRATICS = STROKE_LENGTH - 2\n const firstPoint = stroke.pointers[0]\n\n const parts = []\n if (STROKE_LENGTH < 3) {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6))\n } else {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p))\n parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH))\n\n for (let i = 0; i < NB_QUADRATICS; i++) {\n const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const central = stroke.pointers[i + 1]\n parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH)\n )\n }\n const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2]\n const lastPoint = stroke.pointers[STROKE_LENGTH - 1]\n parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH))\n parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH))\n }\n return parts.join(\" \")\n }\n\n drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void\n {\n const svgPathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n svgPathElement.classList.add(\"pending-stroke\")\n svgPathElement.setAttribute(\"id\", stroke.id)\n svgPathElement.setAttribute(\"type\", \"stroke\")\n attrs?.forEach(a =>\n {\n svgPathElement.setAttribute(a.name, a.value)\n })\n const svgPath = this.buildSVGPath(stroke)\n svgPathElement.setAttribute(\"d\", `${ svgPath }Z`)\n svgElement.appendChild(svgPathElement)\n }\n}\n","import { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from \"../../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { SVGStroker } from \"./SVGStroker\"\n\nexport class WSSVGRenderer\n{\n config: TRenderingConfiguration\n stroker: SVGStroker\n context!: {\n parent: HTMLElement\n }\n\n constructor(config: TRenderingConfiguration)\n {\n this.config = config\n this.stroker = new SVGStroker()\n }\n\n init(element: HTMLElement): void\n {\n element.style.fontSize = \"10px\"\n this.context = {\n parent: element\n }\n }\n\n #drawStroke(svgElement: SVGElement, stroke: TStroke)\n {\n let style: string\n if (stroke.pointerType === \"eraser\") {\n stroke.style.width = 20\n style = \"fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;\"\n } else {\n style = `fill:${ stroke.style.color };stroke:transparent;`\n }\n this.stroker.drawStroke(svgElement, stroke, [{ name: \"style\", value: style }])\n }\n\n #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void\n {\n const oldLayer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement | null\n oldLayer?.remove()\n this.context.parent.insertAdjacentHTML(\"beforeend\", update.svg)\n const layer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement\n if (layerName === \"MODEL\") {\n const pendingStrokesGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n pendingStrokesGroup.id = \"pendingStrokes\"\n layer.appendChild(pendingStrokesGroup)\n }\n }\n\n #replaceElement(update: TUpdatePatchReplaceELement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null\n if (elementToRemove) {\n const parent = elementToRemove.parentNode as HTMLElement | null | undefined\n elementToRemove?.remove()\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n }\n\n #appendChild(layerName: string, update: TUpdatePatchAppendChild): void\n {\n const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer=\"${ layerName }\"]`\n const parent = this.context.parent.querySelector(parentSelector) as HTMLElement\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n\n #removeChild(update: TUpdatePatchRemoveChild): void\n {\n this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove()\n }\n\n #removeElement(update: TUpdatePatchRemoveElement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`)\n if (elementToRemove) {\n if (update.id.includes(\"s\") || update.id.includes(\"MODEL\")) {\n elementToRemove.remove()\n } else {\n elementToRemove.setAttribute(\"class\", \"removed-stroke\")\n setTimeout(() =>\n {\n elementToRemove?.remove()\n }, 100)\n }\n }\n }\n\n #insertBefore(update: TUpdatePatchInsertBefore): void\n {\n const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null\n parent?.insertAdjacentHTML(\"beforebegin\", update.svg)\n }\n\n #setAttribute(update: TUpdatePatchSetAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.setAttribute(update.name, update.value)\n }\n\n #removeAttribute(update: TUpdatePatchRemoveAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.removeAttribute(update.name)\n }\n\n updateLayer(layerName: string, update: TUpdatePatch): void\n {\n switch (update.type) {\n case \"REPLACE_ALL\":\n this.#replaceAll(layerName, update as TUpdatePatchReplaceAll)\n break\n case \"REPLACE_ELEMENT\":\n this.#replaceElement(update as TUpdatePatchReplaceELement)\n break\n case \"APPEND_CHILD\":\n this.#appendChild(layerName, update as TUpdatePatchAppendChild)\n break\n case \"REMOVE_ELEMENT\":\n this.#removeElement(update as TUpdatePatchRemoveElement)\n break\n case \"REMOVE_CHILD\":\n this.#removeChild(update as TUpdatePatchRemoveChild)\n break\n case \"INSERT_BEFORE\":\n this.#insertBefore(update as TUpdatePatchInsertBefore)\n break\n case \"SET_ATTRIBUTE\":\n this.#setAttribute(update as TUpdatePatchSetAttribut)\n break\n case \"REMOVE_ATTRIBUTE\":\n this.#removeAttribute(update as TUpdatePatchRemoveAttribut)\n break\n default:\n break\n }\n }\n\n updatesLayer(layerName: string, updates: TUpdatePatch[]): void\n {\n updates.forEach(u => this.updateLayer(layerName, u))\n this.clearPendingStroke()\n }\n\n clearPendingStroke(): void\n {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n pendingStrokeGroup.innerHTML = \"\"\n }\n }\n\n drawPendingStroke(stroke: TStroke): void\n {\n if (stroke) {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`)\n if (oldStroke) {\n oldStroke.remove()\n }\n this.#drawStroke(pendingStrokeGroup, stroke)\n }\n }\n }\n\n resize(model: IModel): void\n {\n const rect = this.context.parent.getBoundingClientRect()\n const svgList = this.context.parent.querySelectorAll(\"svg\")\n const width = Math.max(rect.width, model.width)\n const height = Math.max(rect.height, model.height)\n svgList.forEach(svg =>\n {\n svg.setAttribute(\"viewBox\", `0 0 ${ width }, ${ height }`)\n svg.setAttribute(\"width\", `${ width }px`)\n svg.setAttribute(\"height\", `${ height }px`)\n })\n }\n\n destroy(): void\n {\n if (this.context.parent) {\n this.context.parent.querySelectorAll(\"svg\").forEach(n => n.remove())\n }\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { TConfiguration } from \"../@types/Configuration\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { WSRecognizer } from \"../recognizer/WSRecognizer\"\nimport { ModeInteraction, WSMessage } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { WSSVGRenderer } from \"../renderer/svg/WSSVGRenderer\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\n\nexport class WSBehaviors implements IBehaviors\n{\n name = \"WSBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: WSSVGRenderer\n recognizer: WSRecognizer\n context: TUndoRedoContext\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n mode: ModeInteraction\n\n #resizeTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new WSSVGRenderer(this.#configuration.rendering)\n this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.mode = ModeInteraction.Writing\n this.#model = new Model()\n this.context = {\n canRedo: false,\n canUndo: false,\n empty: true,\n stackIndex: -1,\n possibleUndoCount: 0,\n stack: []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(ps?: TPenStyle): Promise\n {\n this.styleManager.setPenStyle(ps)\n return this.recognizer.setPenStyle(this.styleManager.penStyle)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(psc?: string): Promise\n {\n this.styleManager.setPenStyleClasses(psc)\n return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(t: TTheme): Promise\n {\n this.styleManager.setTheme(t)\n return this.recognizer.setTheme(this.styleManager.theme)\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.#model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.context.stack.push(this.model.getClone())\n this.context.stackIndex = 0\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n\n this.internalEvent.addSVGPatchListener(this.onSVGPatch)\n this.internalEvent.addContextChangeListener(this.onContextChange)\n\n await this.recognizer.init(this.#model.height, this.#model.width)\n await this.setPenStyle(this.penStyle)\n await this.setTheme(this.theme)\n await this.setPenStyleClasses(this.penStyleClasses)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n let { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n if (this.mode === ModeInteraction.Erasing) {\n pointerType = \"eraser\"\n }\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n\n private onSVGPatch = (evt: TWebSocketSVGPatchEvent) =>\n {\n this.renderer.updatesLayer(evt.layer, evt.updates)\n }\n\n private onContextChange = (context: TUndoRedoContext) =>\n {\n this.context.canRedo = context.canRedo\n this.context.canUndo = context.canUndo\n this.context.empty = context.empty\n this.context.possibleUndoCount = context.possibleUndoCount\n this.context.stackIndex = context.stackIndex\n }\n\n drawCurrentStroke(): void\n {\n const currentStroke = this.model.currentStroke as TStroke\n if (currentStroke) {\n this.renderer.drawPendingStroke(currentStroke)\n }\n }\n\n async updateModelRendering(): Promise\n {\n this.context.stack.push(this.model.getClone())\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n const updatedModel = await this.recognizer.addStrokes(this.model)\n this.model.mergeExport(updatedModel.exports as TExport)\n }\n return this.model\n }\n\n async waitForIdle?(): Promise\n {\n return this.recognizer.waitForIdle()\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n const exportPoints = await this.recognizer.importPointEvents(strokes)\n this.model.mergeExport(exportPoints)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n try {\n if (this.#configuration.triggers.exportContent === \"DEMAND\") {\n return this.recognizer.addStrokes(this.model)\n } else {\n return this.recognizer.export(this.model, mimeTypes)\n }\n } catch (error) {\n this.internalEvent.emitError(error as Error)\n return Promise.reject(error)\n }\n }\n\n async convert(conversionState?: TConverstionState): Promise\n {\n this.context.stack.push(this.model.getClone())\n this.#model = await this.recognizer.convert(this.model, conversionState)\n return this.model\n }\n\n async import(data: Blob, mimeType?: string): Promise\n {\n this.context.stack.push(this.model.getClone())\n return this.recognizer.import(this.model, data, mimeType)\n }\n\n async resize(height: number, width: number): Promise\n {\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n const clonedModel = this.model.getClone()\n this.renderer.resize(clonedModel)\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n try {\n const resizeModel = await this.recognizer.resize(clonedModel)\n deferredResize.resolve(resizeModel)\n } catch (error) {\n deferredResize.reject(error as Error)\n }\n }, this.#configuration.triggers.resizeTriggerDelay)\n\n this.#model = await deferredResize.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n return this.model\n }\n\n async undo(): Promise\n {\n if (this.context.canUndo) {\n this.#model = this.context.stack[this.context.stackIndex - 1]\n return this.recognizer.undo(this.#model)\n }\n else {\n throw new Error(\"Undo not allowed\")\n }\n }\n\n async redo(): Promise\n {\n if (this.context.canRedo) {\n this.#model = this.context.stack[this.context.stackIndex + 1]\n return this.recognizer.redo(this.#model)\n }\n else {\n throw new Error(\"Redo not allowed\")\n }\n }\n\n async clear(): Promise\n {\n this.model.clear()\n this.context.stack.push(this.model.getClone())\n return this.recognizer.clear(this.model)\n }\n\n async destroy(): Promise\n {\n this.grabber.detach()\n this.renderer.destroy()\n this.recognizer.close(1000, WSMessage.CLOSE_RECOGNIZER)\n return Promise.resolve()\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { TConfiguration } from \"./@types/Configuration\"\nimport { IGrabber } from \"./@types/grabber/Grabber\"\nimport { TStroke } from \"./@types/model/Stroke\"\nimport { IModel, TExport, TJIIXExport } from \"./@types/model/Model\"\nimport { TPenStyle } from \"./@types/style/PenStyle\"\nimport { TTheme } from \"./@types/style/Theme\"\nimport { IBehaviors, TBehaviorOptions } from \"./@types/Behaviors\"\nimport { TConverstionState } from \"./@types/configuration/RecognitionConfiguration\"\nimport { TMarginConfiguration } from \"./@types/configuration/recognition/MarginConfiguration\"\nimport { TUndoRedoContext } from \"./@types/undo-redo/UndoRedoContext\"\n\nimport { Exports, ModeInteraction } from \"./Constants\"\nimport { PublicEvent } from \"./event/PublicEvent\"\nimport { InternalEvent } from \"./event/InternalEvent\"\nimport { SmartGuide } from \"./smartguide/SmartGuide\"\nimport { DeferredPromise } from \"./utils/DeferredPromise\"\nimport { RestBehaviors } from \"./behaviors/RestBehaviors\"\nimport { WSBehaviors } from \"./behaviors/WSBehaviors\"\n\nimport \"./iink.css\"\n\nexport type HTMLEditorElement = HTMLElement &\n{\n editor: Editor\n}\n\nexport class Editor\n{\n wrapperHTML: HTMLEditorElement\n #loaderHTML: HTMLDivElement\n #messageHTML: HTMLDivElement\n #behaviors!: IBehaviors\n #smartGuide?: SmartGuide\n #initializationDeferred: DeferredPromise\n\n debug = false\n\n constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = \"ms-editor\")\n {\n this.#initializationDeferred = new DeferredPromise()\n\n this.wrapperHTML = wrapperHTML as HTMLEditorElement\n this.wrapperHTML.classList.add(globalClassCss)\n this.events.setElement(this.wrapperHTML)\n\n this.#loaderHTML = document.createElement(\"div\")\n this.#loaderHTML.classList.add(\"loader\")\n this.#loaderHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#loaderHTML)\n\n this.#messageHTML = document.createElement(\"div\")\n this.#messageHTML.classList.add(\"message\")\n this.#messageHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#messageHTML)\n\n this.#instantiateBehaviors(options)\n this.#addListeners()\n }\n\n get initializationPromise(): Promise\n {\n return this.#initializationDeferred.promise\n }\n\n get model(): IModel\n {\n return this.behaviors.model\n }\n\n get behaviors(): IBehaviors\n {\n return this.#behaviors\n }\n\n get configuration(): TConfiguration\n {\n return this.behaviors.configuration\n }\n set configuration(configuration: TConfiguration)\n {\n this.#instantiateBehaviors({ configuration })\n this.initialize()\n }\n\n get mode(): ModeInteraction\n {\n return this.behaviors.mode\n }\n set mode(m: ModeInteraction)\n {\n this.behaviors.mode = m\n switch (this.behaviors.mode) {\n case ModeInteraction.Erasing:\n this.wrapperHTML.classList.add(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n // case ModeInteraction.Selecting:\n // this.model.resetSelectedStrokes()\n // this.wrapperHTML.classList.remove(\"erasing\")\n // this.wrapperHTML.classList.add(\"selecting\")\n // break;\n default:\n document.body.style.cursor = \"initial\"\n this.wrapperHTML.classList.remove(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n }\n }\n\n get events(): PublicEvent\n {\n return PublicEvent.getInstance()\n }\n\n get context(): TUndoRedoContext\n {\n return this.behaviors.context\n }\n\n get grabber(): IGrabber\n {\n return this.behaviors.grabber\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.behaviors.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.behaviors.penStyle\n }\n set penStyle(ps: TPenStyle)\n {\n this.behaviors.setPenStyle(ps)\n }\n\n get theme(): TTheme\n {\n return this.behaviors.theme\n }\n set theme(t: TTheme)\n {\n this.behaviors.setTheme(t)\n }\n\n get penStyleClasses(): string\n {\n return this.behaviors.penStyleClasses\n }\n set penStyleClasses(psc: string)\n {\n this.behaviors.setPenStyleClasses(psc)\n }\n\n #instantiateBehaviors(options: TBehaviorOptions)\n {\n if (!options?.configuration) {\n throw new Error(\"Configuration required\")\n }\n if (this.#behaviors) {\n this.#behaviors.destroy()\n }\n let defaultBehaviors: IBehaviors\n if (options.configuration.server?.protocol === \"REST\") {\n defaultBehaviors = new RestBehaviors(options)\n } else {\n defaultBehaviors = new WSBehaviors(options)\n }\n this.#behaviors = Object.assign(defaultBehaviors, options.behaviors)\n }\n\n #initializeBehaviors(): Promise\n {\n this.#initializationDeferred = new DeferredPromise()\n this.#loaderHTML.style.display = \"initial\"\n this.#cleanMessage()\n return this.behaviors.init(this.wrapperHTML)\n .then(async () =>\n {\n this.wrapperHTML.editor = this\n this.#initializationDeferred.resolve()\n this.events.emitLoaded()\n })\n .catch((e: Error) =>\n {\n this.#initializationDeferred.reject(e)\n this.#showError(e)\n })\n .finally(() =>\n {\n this.#loaderHTML.style.display = \"none\"\n return this.#initializationDeferred.promise\n })\n }\n\n #initializeSmartGuide(): void\n {\n this.#smartGuide?.destroy()\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide = new SmartGuide()\n let margin: TMarginConfiguration\n switch (this.configuration.recognition.type) {\n case \"TEXT\":\n margin = this.configuration.recognition.text.margin\n break\n case \"MATH\":\n margin = this.configuration.recognition.math.margin\n break\n default:\n margin = {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n }\n break\n }\n this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering)\n }\n }\n\n #cleanMessage()\n {\n this.#messageHTML.style.display = \"none\"\n this.#messageHTML.innerHTML = \"\"\n }\n\n #showError(err: Error)\n {\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"error-msg\")\n this.#messageHTML.classList.remove(\"info-msg\")\n this.#messageHTML.innerText = err.message\n if (this.debug) {\n const pName = document.createElement(\"p\")\n pName.innerHTML = err.name\n this.#messageHTML.prepend(pName)\n\n const pStack = document.createElement(\"p\")\n pStack.style.width = \"50vw\"\n pStack.style.marginLeft = \"calc(-25vw + 100px)\"\n pStack.innerHTML = err.stack || \"\"\n this.#messageHTML.appendChild(pStack)\n }\n }\n\n #showNotif(notif: { message: string, timeout?: number })\n {\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"info-msg\")\n this.#messageHTML.classList.remove(\"error-msg\")\n this.#messageHTML.innerText = notif.message\n setTimeout(() =>\n {\n this.#cleanMessage()\n }, notif.timeout || 2500)\n }\n\n #showStrokesIfDebug(): void\n {\n if (this.debug) {\n let panel = document.getElementById(\"stroke-panel\")\n const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers })))\n if (!panel) {\n panel = document.createElement(\"div\")\n panel.id = \"stroke-panel\"\n panel.addEventListener(\"click\", () =>\n {\n navigator.clipboard.writeText(panel?.innerText as string)\n this.#showNotif({ message: \"strokes copied to clipboard!\", timeout: 1500 })\n })\n this.wrapperHTML.appendChild(panel)\n }\n panel.innerText = text\n }\n }\n\n #addListeners(): void\n {\n InternalEvent.getInstance().addConvertListener(this.convert.bind(this))\n InternalEvent.getInstance().addClearListener(this.clear.bind(this))\n InternalEvent.getInstance().addErrorListener(this.#showError.bind(this))\n InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this))\n InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this))\n InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this))\n InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this))\n InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this))\n InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this))\n }\n\n #onContextChange = (context: TUndoRedoContext) =>\n {\n this.events.emitChanged(context)\n }\n\n #onIdleChange = (idle: boolean) =>\n {\n this.events.emitIdle(idle)\n }\n\n #onExport(exports: TExport): void\n {\n this.model.mergeExport(exports)\n if (this.configuration.rendering.smartGuide.enable) {\n if (exports && exports[\"application/vnd.myscript.jiix\"]) {\n const jjix = exports[\"application/vnd.myscript.jiix\"] as TJIIXExport\n this.#smartGuide?.update(jjix)\n }\n }\n this.#showStrokesIfDebug()\n this.events.emitExported(exports)\n }\n\n #onImportJIIX(jiix: TJIIXExport): void\n {\n this.import(new Blob([JSON.stringify(jiix)], { type: Exports.JIIX }), Exports.JIIX)\n }\n\n async initialize(): Promise\n {\n await this.#initializeBehaviors()\n this.#initializeSmartGuide()\n }\n\n async waitForIdle(): Promise\n {\n if (this.behaviors.waitForIdle)\n {\n return this.behaviors.waitForIdle()\n }\n return\n }\n\n async undo(): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.undo()\n this.#showStrokesIfDebug()\n return this.model\n }\n\n async redo(): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.redo()\n this.#showStrokesIfDebug()\n return this.model\n }\n\n async clear(): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.clear()\n this.events.emitCleared(this.model)\n this.#showStrokesIfDebug()\n return this.model\n }\n\n async resize(): Promise\n {\n await this.#initializationDeferred.promise\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide?.resize()\n }\n const height = Math.max(this.wrapperHTML.clientHeight, this.configuration.rendering.minHeight)\n const width = Math.max(this.wrapperHTML.clientWidth, this.configuration.rendering.minWidth)\n await this.behaviors.resize(height, width)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.export(mimeTypes)\n return this.model\n }\n\n async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.convert(params?.conversionState, params?.mimeTypes)\n this.events.emitConverted(this.model.converts as TExport)\n return this.model\n }\n\n async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise\n {\n await this.#initializationDeferred.promise\n if (this.behaviors.import) {\n let blobToImport: Blob\n if (data instanceof Blob) {\n blobToImport = data\n }\n else if (typeof data === \"string\") {\n blobToImport = new Blob([data])\n }\n else {\n blobToImport = new Blob([JSON.stringify(data)])\n }\n await this.behaviors.import(blobToImport, mimeType)\n this.events.emitImported(this.model.exports as TExport)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no import function\")\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n await this.#initializationDeferred.promise\n if (this.behaviors.importPointEvents) {\n await this.behaviors.importPointEvents(strokes)\n this.events.emitImported(this.model.exports as TExport)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no importPointEvents function\")\n }\n\n}\n","import { TConfigurationClient } from \"../@types/Configuration\"\n\nexport async function getAvailableFontList(configuration: TConfigurationClient): Promise>\n{\n if (!configuration?.server?.scheme && !configuration?.server?.host) {\n return Promise.reject(\"Failed to get fonts: configuration.server.scheme & configuration.server.host are required!\")\n }\n if (!configuration?.recognition?.lang) {\n return Promise.reject(\"Failed to get fonts: configuration.recognition.lang is required!\")\n }\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang)\n const { result } = await response.json()\n return result.sort()\n}\n","import { TConfigurationClient } from \"../@types/Configuration\"\n\nexport async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>\n{\n if (configuration?.server?.scheme && configuration?.server?.host) {\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`)\n return response.json()\n } else {\n return Promise.reject(\"Failed to get languages: configuration.server.scheme & configuration.server.host are required!\")\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","get","__classPrivateFieldSet","set","Error","NO_ACTIVITY","WRONG_CREDENTIALS","TOO_OLD","UNKNOW","ABNORMAL_CLOSURE","CANT_ESTABLISH","GOING_AWAY","PROTOCOL_ERROR","UNSUPPORTED_DATA","INVALID_FRAME_PAULOAD","POLICY_VIOLATION","MESSAGE_TOO_BIG","INTERNAL_ERROR","SERVICE_RESTART","TRY_AGAIN","BAD_GATEWAY","TLS_HANDSHAKE","EventType","CHANGED","CLEARED","CONVERTED","ERROR","POINTEREVENTS","EXPORTED","IMPORTED","IDLE","LOADED","InternalEventType","SVG_PATCH","CLEAR_MESSAGE","NOTIF","IMPORT_JIIX","CONVERT","CLEAR","CONTEXT_CHANGE","WS_CLOSED","WSMessage","CLOSE_RECOGNIZER","Exports","JIIX","TEXT","LATEX","MATHML","SVG","OFFICE_DOCUMENT","ModeInteraction","Constants","PublicEvent","EventTarget","constructor","super","_PublicEvent_element","this","static","_a","_PublicEvent_instance","setElement","el","emitLoaded","emitExported","exports","_PublicEvent_instances","_PublicEvent_emit","emitChanged","undoRedoContext","Object","assign","canClear","empty","emitIdle","idle","emitCleared","model","emitConverted","emitImported","WeakMap","WeakSet","type","data","evt","CustomEvent","bubbles","composed","detail","undefined","dispatchEvent","_b","InternalEvent","_InternalEvent_abortController","AbortController","_InternalEvent_instance","removeAllListeners","abort","emitSVGPatch","patchChange","_InternalEvent_instances","_InternalEvent_emit","addSVGPatchListener","callback","addEventListener","signal","addExportedListener","emitClearMessage","addClearMessageListener","emitError","err","addErrorListener","emitWSClosed","addWSClosedListener","emitNotif","notif","addNotifListener","emitImportJIIX","jiix","addImportJIIXListener","emitConvert","conversionState","addConvertListener","emitClear","addClearListener","emitContextChange","context","addContextChangeListener","addIdleListener","SmartGuide","_SmartGuide_smartGuideElement","_SmartGuide_prompterContainerElement","_SmartGuide_prompterTextElement","_SmartGuide_ellipsisElement","_SmartGuide_tagElement","_SmartGuide_candidatesElement","_SmartGuide_menuElement","_SmartGuide_convertElement","_SmartGuide_copyElement","_SmartGuide_deleteElement","_SmartGuide_fadeOutTimout","_SmartGuide_isMenuOpen","_SmartGuide_showCandidates","target","wordId","parseInt","id","replace","uuid","words","wordToChange","toString","innerHTML","candidates","style","display","forEach","word","index","label","top","left","getBoundingClientRect","parent","_d","_c","parentNode","insertBefore","_e","_SmartGuide_onClickEllipsis","preventDefault","stopPropagation","_SmartGuide_instances","_SmartGuide_hideCandidates","_SmartGuide_onClickConvert","internalEvent","_SmartGuide_closeMenu","_SmartGuide_onClickCopy","message","innerText","navigator","clipboard","writeText","timeout","_SmartGuide_onClickDelete","_SmartGuide_onClickCandidate","candidate","includes","_SmartGuide_onClickPrompter","_SmartGuide_onClickOutSide","Math","random","substring","margin","bottom","right","_SmartGuide_createWrapperElement","_SmartGuide_createPrompterContainerElement","_SmartGuide_createPrompterTextElement","_SmartGuide_createEllipsisElement","_SmartGuide_createTagElement","_SmartGuide_createCandidatesElement","_SmartGuide_createMoreMenuElement","_SmartGuide_createConvertElement","_SmartGuide_createCopyElement","_SmartGuide_createDeleteElement","getInstance","init","domElement","renderingConfiguration","appendChild","classList","add","_SmartGuide_addListeners","_SmartGuide_show","smartGuide","fadeOut","enable","_SmartGuide_initFadeOutObserver","duration","resize","mmToPixels","marginTop","marginLeft","marginRight","offsetWidth","width","clientWidth","offsetHeight","update","createWordSpan","span","document","createElement","textContent","myFragment","createDocumentFragment","length","lastWord","scrollLeft","offsetLeft","populatePrompter","clear","_SmartGuide_hide","destroy","setAttribute","MutationObserver","clearTimeout","contains","setTimeout","observe","childList","subtree","attributes","remove","_SmartGuide_openMenu","DeferredPromise","isFullFilled","isPending","promise","v","PointerEventGrabber","configuration","prevent","pointerDownHandler","button","buttons","activePointerId","pointerId","onPointerDown","point","extractPoint","pointerMoveHandler","onPointerMove","pointerUpHandler","onPointerUp","roundFloat","oneFloat","requestedFloatPrecision","floatPrecision","pow","round","event","clientX","clientY","changedTouches","rect","x","clientLeft","xyFloatPrecision","y","clientTop","t","Date","now","timestampFloatPrecision","p","pressure","attach","detach","listenerOptions","documentElement","removeEventListener","_f","ShapeSymbols","table","shape","recognizedShape","ellipse","line","phi","angle","returnedAngle","PI","drawArrowHead","context2D","headPoint","alpha","beta","save","fillStyle","strokeStyle","moveTo","beginPath","lineTo","cos","sin","fill","restore","drawShapeEllipse","shapeEllipse","points","drawEllipseArc","centerPoint","maxRadius","minRadius","orientation","startAngle","sweepAngle","z1","z3","z2","z4","n","floor","abs","boundariesPoints","i","atan2","cosAlpha","sinAlpha","push","stroke","beginDecoration","beginTangentAngle","endDecoration","endTangentAngle","drawLine","p1","p2","drawShapeSymbol","symbol","lineWidth","color","elementType","shapeSymbol","selectedCandidateIndex","lines","lineSymbol","drawShapeLine","shapeLine","firstPoint","lastPoint","primitives","primitive","drawStroke","stroker","pointerType","TextSymbols","inputCharacter","char","string","textLine","drawTextLine","drawText","font","textHeight","textAlign","justificationType","textBaseline","fillText","topLeftPoint","height","underlineList","underline","drawUnderline","delta","firstCharacter","lastCharacter","drawTextSymbol","console","info","computeLinksPoints","radius","computeMiddlePoint","point1","point2","computeAxeAngle","begin","end","CanvasStroker","renderArc","context2d","center","arc","renderLine","linkPoints1","linkPoints2","renderFinal","linkPoints","newAngle","renderQuadratic","ctrl","linkPoints3","quadraticCurveTo","NUMBER_POINTS","pointers","NUMBER_QUADRATICS","secondPoint","beginLine","endLine","beginFinal","endFinal","closePath","CanvasRenderer","config","createCanvas","canvas","resizeContent","pixelRatio","window","devicePixelRatio","renderingCanvas","capturingCanvas","max","minWidth","minHeight","clientHeight","getContext","scale","drawSymbol","keys","element","renderingCanvasContext","capturingCanvasContext","drawModel","clearRect","rawStrokes","drawPendingStroke","module","o","r","l","m","c","d","defineProperty","configurable","enumerable","__esModule","default","prototype","hasOwnProperty","s","Symbol","iterator","toJSON","error","u","split","trim","indexOf","_trimSemiColon","toCSS","slice","parser","JsonCSS","StyleHelper","themeToCSS","json","themeToJSON","theme","Number","ink","penStyleToCSS","penStyle","css","penStyleToJSON","penStyleString","stringToJSON","JSONToString","entries","map","k","join","CryptoJS","create","F","obj","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","$super","arguments","instance","properties","propertyName","clone","WordArray","sigBytes","encoder","Hex","stringify","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","_r","C_enc","enc","hexChars","bite","parse","hexStr","hexStrLength","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","key","C_algo","HMAC","algo","require$$0","X32WordArray","C_x64","x64","Word","high","low","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","X64Word","X64WordArray","X64Word_create","K","W","SHA512","_hash","M","H","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","al","bh","bl","ch","cl","dh","dl","eh","fh","fl","gh","gl","hh","hl","Wi","Wih","Wil","gamma0x","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1x","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","t1l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1h","t2l","nBitsTotal","nBitsLeft","HmacSHA512","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","computeHmac","applicationKey","hmacKey","isVersionSuperiorOrEqual","source","sourceParts","targetParts","a","b","Stroke","convertStrokeToJSON","RestRecognizer","serverConfig","recognitionConfig","serverConfiguration","recognitionConfiguration","url","scheme","host","postConfig","lang","diagram","export","math","text","buildData","strokeGroupByPenStyle","groupIndex","findIndex","sg","isPenStyleEqual","ps1","ps2","strokes","strokeGroupsToSend","group","newGroup","JSON","contentType","charAt","toUpperCase","toLowerCase","xDPI","yDPI","strokeGroups","post","mimeType","headers","Headers","append","version","reqInit","method","body","request","Request","response","fetch","ok","blob","catch","tryFetch","res","ErrorConst","code","getMimeTypes","requestedMimeTypes","mimeTypes","convert","myModel","getClone","dataToConcert","promises","mt","all","mergeConvert","mimeTypesRequiringExport","filter","mergeExport","UndoRedoContext","stackIndex","possibleUndoCount","canRedo","canUndo","stack","UndoRedoManager","updateCanUndoRedo","currentModel","addModelToStack","maxStackSize","shift","removeLastModelInStack","pop","updateModelInStack","modificationDate","undo","redo","mergeDeep","sources","isObject","item","Array","isArray","DefaultPenStyle","DefaultTheme","StyleManager","_StyleManager_penStyle","_StyleManager_theme","_StyleManager_penStyleClasses","_StyleManager_currentPenStyle","setTheme","setPenStyleClasses","setPenStyle","currentPenStyle","structuredClone","penStyleClasses","psc","DefaultServerConfiguration","protocol","useWindowLocation","websocket","pingEnabled","pingDelay","maxPingLostCount","autoReconnect","maxRetryCount","fileChunkSize","DefaultRecognitionConfiguration","alwaysConnected","gesture","chars","renderer","debug","solver","eraser","mode","guides","recognition","DefaultGrabberConfiguration","capture","passive","DefaultRenderingConfiguration","gap","DefaultTriggerConfiguration","exportContent","exportContentDelay","resizeTriggerDelay","DefaultEventsConfiguration","processDelay","DefaultUndoRedoConfiguration","DefaultConfiguration","server","grabber","rendering","triggers","events","Configuration","overrideDefaultConfiguration","defaultConf","_g","location","computeDistance","distance","hypot","isNaN","Model","creationDate","creationTime","selectedStrokes","positions","lastSentPosition","lastReceivedPosition","converts","computePressure","globalDistance","ratio","sqrt","filterPointByAcquisitionDelta","lastPointer","addPoint","pointer","at","addStroke","extractUnsentStrokes","initCurrentStroke","dpi","pxWidth","currentStroke","appendToCurrentStroke","endCurrentStroke","resetSelectedStrokes","appendSelectedStrokesFromPoint","_Model_instances","_Model_getStrokeFromPoint","updateStroke","updatedStroke","strokeIndex","removeStroke","removeStrokesFromPoint","strokeToRemove","updatePositionSent","position","updatePositionReceived","clonedModel","isBetween","val","_strokeList","strokePointer","RestBehaviors","options","name","_RestBehaviors_configuration","_RestBehaviors_model","_RestBehaviors_resizeTimer","_RestBehaviors_exportTimer","styleManager","recognizer","undoRedoManager","ps","bind","updateModelRendering","drawCurrentStroke","_evt","newModel","deferred","deferredResize","resizeModel","WSRecognizer","pingCount","reconnectionCount","toLocaleLowerCase","infinitePing","socket","close","readyState","send","openCallback","connected","params","sessionId","iinkSessionId","xDpi","yDpi","viewSizeHeight","viewSizeWidth","rejectDeferredPending","initialized","addStrokeDeferred","exportDeferred","_h","convertDeferred","_j","_k","importDeferred","_l","_m","resizeDeferred","_o","_p","undoDeferred","_q","redoDeferred","_s","_t","clearDeferred","_u","waitForIdleDeferred","_v","closeCallback","currentErrorCode","reason","manageHMACChallengeMessage","websocketMessage","hmacChallengeMessage","hmacChallenge","hmac","manageContentPackageDescriptionMessage","currentPartId","managePartChangeMessage","partChangeMessage","partId","manageExportMessage","exportMessage","importPointEventsDeferred","manageWaitForIdle","manageErrorMessage","manageContentChangeMessage","contentChangeMessage","undoStackIndex","manageSVGPatchMessage","svgPatchMessage","messageCallback","WebSocket","OPEN","CONNECTING","addStrokes","localModel","styleClasses","import","chunkSize","importFileId","readBlob","fileReader","FileReader","onloadend","ev","onerror","readAsText","importFileMessage","size","blobPart","fileChuckMessage","lastChunk","importPointEvents","exportPoints","myExportConverted","waitForIdle","undoExports","redoExports","clearExports","SVGStroker","getArcPath","getLinePath","getFinalPath","parts","getQuadraticPath","central","buildSVGPath","STROKE_LENGTH","STROKE_WIDTH","NB_QUADRATICS","beforeLastPoint","svgElement","attrs","svgPathElement","createElementNS","svgPath","WSSVGRenderer","fontSize","updateLayer","layerName","_WSSVGRenderer_instances","_WSSVGRenderer_replaceElement","_WSSVGRenderer_removeElement","_WSSVGRenderer_removeChild","_WSSVGRenderer_insertBefore","_WSSVGRenderer_setAttribute","_WSSVGRenderer_removeAttribute","updatesLayer","updates","clearPendingStroke","pendingStrokeGroup","querySelector","oldStroke","svgList","querySelectorAll","svg","_WSSVGRenderer_drawStroke","_WSSVGRenderer_replaceAll","oldLayer","insertAdjacentHTML","layer","pendingStrokesGroup","elementToRemove","_WSSVGRenderer_appendChild","parentSelector","parentId","refId","selector","removeAttribute","WSBehaviors","_WSBehaviors_configuration","_WSBehaviors_model","_WSBehaviors_resizeTimer","onSVGPatch","onContextChange","updatedModel","styleInject","ref","insertAt","head","getElementsByTagName","firstChild","styleSheet","cssText","createTextNode","Editor","wrapperHTML","globalClassCss","_Editor_loaderHTML","_Editor_messageHTML","_Editor_behaviors","_Editor_smartGuide","_Editor_initializationDeferred","_Editor_onContextChange","_Editor_onIdleChange","_Editor_instances","_Editor_instantiateBehaviors","_Editor_addListeners","initializationPromise","behaviors","initialize","cursor","_Editor_initializeBehaviors","_Editor_initializeSmartGuide","_Editor_showStrokesIfDebug","blobToImport","Blob","getAvailableFontList","sort","getAvailableLanguageList","defaultBehaviors","_Editor_cleanMessage","editor","_Editor_showError","finally","pName","prepend","pStack","panel","getElementById","_Editor_showNotif","_Editor_onImportJIIX","_Editor_onExport","jjix"],"mappings":"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"} \ No newline at end of file diff --git a/dist/iink.min.js b/dist/iink.min.js new file mode 100644 index 00000000..f2c8bc83 --- /dev/null +++ b/dist/iink.min.js @@ -0,0 +1,2 @@ +!function(i,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((i="undefined"!=typeof globalThis?globalThis:i||self).iink={})}(this,(function(i){"use strict";function __awaiter(i,n,s,a){return new(s||(s=Promise))((function(l,d){function fulfilled(i){try{step(a.next(i))}catch(i){d(i)}}function rejected(i){try{step(a.throw(i))}catch(i){d(i)}}function step(i){i.done?l(i.value):function adopt(i){return i instanceof s?i:new s((function(n){n(i)}))}(i.value).then(fulfilled,rejected)}step((a=a.apply(i,n||[])).next())}))}function __classPrivateFieldGet(i,n,s,a){if("a"===s&&!a)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?i!==n||!a:!n.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?a:"a"===s?a.call(i):a?a.value:n.get(i)}function __classPrivateFieldSet(i,n,s,a,l){if("m"===a)throw new TypeError("Private method is not writable");if("a"===a&&!l)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?i!==n||!l:!n.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===a?l.call(i,s):l?l.value=s:n.set(i,s),s}const n={NO_ACTIVITY:"Session closed due to no activity.",WRONG_CREDENTIALS:"Application credentials are invalid. Please check or regenerate your application key and hmackey.",TOO_OLD:"Session is too old. Max Session Duration Reached.",UNKNOW:"An unknown error has occurred.",ABNORMAL_CLOSURE:"MyScript recognition server is not reachable.",CANT_ESTABLISH:"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.",GOING_AWAY:"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.",PROTOCOL_ERROR:"MyScript recognition server terminated the connection due to a protocol error.",UNSUPPORTED_DATA:"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)",INVALID_FRAME_PAULOAD:"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).",POLICY_VIOLATION:"MyScript recognition server terminated the connection because it received a message that violates its policy.",MESSAGE_TOO_BIG:"MyScript recognition server terminated the connection because a data frame was received that is too large.",INTERNAL_ERROR:"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.",SERVICE_RESTART:"MyScript recognition server terminated the connection because it is restarting.",TRY_AGAIN:"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.",BAD_GATEWAY:"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.",TLS_HANDSHAKE:"MyScript recognition server connection was closed due to a failure to perform a TLS handshake"},s={CHANGED:"changed",CLEARED:"cleared",CONVERTED:"converted",ERROR:"error",POINTEREVENTS:"pointer_events",EXPORTED:"exported",IMPORTED:"imported",IDLE:"idle",LOADED:"loaded"},a={SVG_PATCH:"internal_svg_patch",EXPORTED:"internal_exported",CLEAR_MESSAGE:"internal_clear_message",ERROR:"internal_error",NOTIF:"internal_notif",IMPORT_JIIX:"internal_import_jiix",CONVERT:"internal_convert",CLEAR:"internal_clear",CONTEXT_CHANGE:"internal_context_change",IDLE:"internal_idle",WS_CLOSED:"internal_websocket_closed"},l={CLOSE_RECOGNIZER:"CLOSE_RECOGNIZER"},d={JIIX:"application/vnd.myscript.jiix",TEXT:"text/plain",LATEX:"application/x-latex",MATHML:"application/mathml+xml",SVG:"image/svg+xml",OFFICE_DOCUMENT:"application/vnd.openxmlformats-officedocument.presentationml.presentation"};var c;i.ModeInteraction=void 0,(c=i.ModeInteraction||(i.ModeInteraction={})).Writing="writing",c.Erasing="erasing";var h,u,p,v,m,g,f,_,y,P,w,S,x,b,E,C,k,M,G,T,L,I,D,A,R,O,N,W,z,j,H,X,B,U,$,J,V,Y,q,Z,K,Q,ee,te,ie,ne,se,re,oe={Error:n,EventType:s,InternalEventType:a,Exports:d,WSMessage:l};class PublicEvent extends EventTarget{constructor(){super(),h.add(this),v.set(this,void 0)}static getInstance(){return __classPrivateFieldGet(PublicEvent,u,"f",p)||__classPrivateFieldSet(PublicEvent,u,new PublicEvent,"f",p),__classPrivateFieldGet(PublicEvent,u,"f",p)}setElement(i){__classPrivateFieldSet(this,v,i,"f")}emitLoaded(){__classPrivateFieldGet(this,h,"m",m).call(this,s.LOADED)}emitExported(i){__classPrivateFieldGet(this,h,"m",m).call(this,s.EXPORTED,i)}emitChanged(i){__classPrivateFieldGet(this,h,"m",m).call(this,s.CHANGED,Object.assign(Object.assign({},i),{canClear:!i.empty}))}emitIdle(i){__classPrivateFieldGet(this,h,"m",m).call(this,s.IDLE,i)}emitCleared(i){__classPrivateFieldGet(this,h,"m",m).call(this,s.CLEARED,i)}emitConverted(i){__classPrivateFieldGet(this,h,"m",m).call(this,s.CONVERTED,i)}emitImported(i){__classPrivateFieldGet(this,h,"m",m).call(this,s.IMPORTED,i)}}u=PublicEvent,v=new WeakMap,h=new WeakSet,m=function _PublicEvent_emit(i,n){var s;const a=new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},n?{detail:n}:void 0));this.dispatchEvent(a),null===(s=__classPrivateFieldGet(this,v,"f"))||void 0===s||s.dispatchEvent(a)},p={value:void 0};class InternalEvent extends EventTarget{constructor(){super(),g.add(this),y.set(this,void 0),__classPrivateFieldSet(this,y,new AbortController,"f")}static getInstance(){return __classPrivateFieldGet(InternalEvent,f,"f",_)||__classPrivateFieldSet(InternalEvent,f,new InternalEvent,"f",_),__classPrivateFieldGet(InternalEvent,f,"f",_)}removeAllListeners(){__classPrivateFieldGet(this,y,"f").abort()}emitSVGPatch(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.SVG_PATCH,i)}addSVGPatchListener(i){this.addEventListener(a.SVG_PATCH,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitExported(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.EXPORTED,i)}addExportedListener(i){this.addEventListener(a.EXPORTED,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitClearMessage(){__classPrivateFieldGet(this,g,"m",P).call(this,a.CLEAR_MESSAGE)}addClearMessageListener(i){this.addEventListener(a.CLEAR_MESSAGE,(()=>i()),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitError(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.ERROR,i)}addErrorListener(i){this.addEventListener(a.ERROR,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitWSClosed(){__classPrivateFieldGet(this,g,"m",P).call(this,a.WS_CLOSED)}addWSClosedListener(i){this.addEventListener(a.WS_CLOSED,(()=>i()),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitNotif(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.NOTIF,i)}addNotifListener(i){this.addEventListener(a.NOTIF,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitImportJIIX(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.IMPORT_JIIX,i)}addImportJIIXListener(i){this.addEventListener(a.IMPORT_JIIX,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitConvert(i="DIGITAL_EDIT"){__classPrivateFieldGet(this,g,"m",P).call(this,a.CONVERT,i)}addConvertListener(i){this.addEventListener(a.CONVERT,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitClear(){__classPrivateFieldGet(this,g,"m",P).call(this,a.CLEAR)}addClearListener(i){this.addEventListener(a.CLEAR,(()=>i()),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitContextChange(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.CONTEXT_CHANGE,i)}addContextChangeListener(i){this.addEventListener(a.CONTEXT_CHANGE,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}emitIdle(i){__classPrivateFieldGet(this,g,"m",P).call(this,a.IDLE,i)}addIdleListener(i){this.addEventListener(a.IDLE,(n=>i(n.detail)),{signal:__classPrivateFieldGet(this,y,"f").signal})}}f=InternalEvent,y=new WeakMap,g=new WeakSet,P=function _InternalEvent_emit(i,n){this.dispatchEvent(new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},n?{detail:n}:void 0)))},_={value:void 0};class SmartGuide{constructor(){w.add(this),S.set(this,void 0),x.set(this,void 0),b.set(this,void 0),E.set(this,void 0),C.set(this,void 0),k.set(this,void 0),M.set(this,void 0),G.set(this,void 0),T.set(this,void 0),L.set(this,void 0),I.set(this,void 0),D.set(this,void 0),V.set(this,(i=>{var n,s,a,l,d;const c=parseInt(i.id.replace("word-","").replace(this.uuid,"")),h=null===(n=this.jiix)||void 0===n?void 0:n.words;if(this.wordToChange=h[c],this.wordToChange&&(this.wordToChange.id=c.toString(),__classPrivateFieldGet(this,k,"f").innerHTML="",null===(s=this.wordToChange)||void 0===s?void 0:s.candidates)){__classPrivateFieldGet(this,k,"f").style.display="flex",this.wordToChange.candidates.forEach(((i,n)=>{var s;(null===(s=this.wordToChange)||void 0===s?void 0:s.label)===i?__classPrivateFieldGet(this,k,"f").innerHTML+=`${i}`:__classPrivateFieldGet(this,k,"f").innerHTML+=`${i}`}));const n=48,s=i.getBoundingClientRect().left-60;__classPrivateFieldGet(this,k,"f").style.top=`${n}px`,__classPrivateFieldGet(this,k,"f").style.left=`${s}px`;const c=null===(l=null===(a=i.parentNode)||void 0===a?void 0:a.parentNode)||void 0===l?void 0:l.parentNode;c&&c.insertBefore(__classPrivateFieldGet(this,k,"f"),null===(d=i.parentNode)||void 0===d?void 0:d.parentNode)}})),K.set(this,(i=>{i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,D,"f")?__classPrivateFieldGet(this,w,"m",Z).call(this):__classPrivateFieldGet(this,w,"m",q).call(this),__classPrivateFieldGet(this,w,"m",Y).call(this)})),Q.set(this,(i=>{i.preventDefault(),i.stopPropagation(),this.internalEvent.emitConvert(),__classPrivateFieldGet(this,w,"m",Z).call(this)})),ee.set(this,(i=>__awaiter(this,void 0,void 0,(function*(){i.preventDefault(),i.stopPropagation();try{__classPrivateFieldGet(this,w,"m",Z).call(this);let i="Nothing to copy";__classPrivateFieldGet(this,b,"f").innerText&&(i=`"${__classPrivateFieldGet(this,b,"f").innerText}" copied to clipboard`,yield navigator.clipboard.writeText(__classPrivateFieldGet(this,b,"f").innerText)),this.internalEvent.emitNotif({message:i,timeout:1500})}catch(i){this.internalEvent.emitError(i)}})))),te.set(this,(i=>{i.preventDefault(),i.stopPropagation(),this.internalEvent.emitClear(),__classPrivateFieldGet(this,w,"m",Z).call(this)})),ie.set(this,(i=>{var n,s,a,l;i.preventDefault(),i.stopPropagation();const d=i.target.innerText;this.jiix&&d!==(null===(n=this.wordToChange)||void 0===n?void 0:n.label)&&(null===(a=null===(s=this.wordToChange)||void 0===s?void 0:s.candidates)||void 0===a?void 0:a.includes(d))&&(this.jiix.words[parseInt(null===(l=this.wordToChange)||void 0===l?void 0:l.id)].label=d,this.internalEvent.emitImportJIIX(this.jiix)),__classPrivateFieldGet(this,k,"f").style.display="none"})),ne.set(this,(i=>{i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,w,"m",Z).call(this);const n=i.target;n.id!==__classPrivateFieldGet(this,b,"f").id?__classPrivateFieldGet(this,V,"f").call(this,n):__classPrivateFieldGet(this,w,"m",Y).call(this)})),se.set(this,(()=>{__classPrivateFieldGet(this,w,"m",Y).call(this),__classPrivateFieldGet(this,w,"m",Z).call(this)})),this.uuid=Math.random().toString(10).substring(2,12),this.margin={bottom:0,left:0,right:0,top:0},__classPrivateFieldGet(this,w,"m",A).call(this),__classPrivateFieldGet(this,w,"m",R).call(this),__classPrivateFieldGet(this,w,"m",O).call(this),__classPrivateFieldGet(this,w,"m",N).call(this),__classPrivateFieldGet(this,w,"m",W).call(this),__classPrivateFieldGet(this,w,"m",z).call(this),__classPrivateFieldGet(this,w,"m",j).call(this),__classPrivateFieldGet(this,w,"m",H).call(this),__classPrivateFieldGet(this,w,"m",X).call(this),__classPrivateFieldGet(this,w,"m",B).call(this)}get internalEvent(){return InternalEvent.getInstance()}init(i,n,s){i.appendChild(__classPrivateFieldGet(this,S,"f")),__classPrivateFieldGet(this,S,"f").appendChild(__classPrivateFieldGet(this,C,"f")),__classPrivateFieldGet(this,x,"f").appendChild(__classPrivateFieldGet(this,b,"f")),__classPrivateFieldGet(this,S,"f").appendChild(__classPrivateFieldGet(this,x,"f")),__classPrivateFieldGet(this,S,"f").appendChild(__classPrivateFieldGet(this,E,"f")),__classPrivateFieldGet(this,M,"f").appendChild(__classPrivateFieldGet(this,G,"f")),__classPrivateFieldGet(this,M,"f").appendChild(__classPrivateFieldGet(this,T,"f")),__classPrivateFieldGet(this,M,"f").appendChild(__classPrivateFieldGet(this,L,"f")),__classPrivateFieldGet(this,S,"f").appendChild(__classPrivateFieldGet(this,M,"f")),__classPrivateFieldGet(this,M,"f").classList.add("close"),__classPrivateFieldSet(this,D,!1,"f"),__classPrivateFieldGet(this,S,"f").appendChild(__classPrivateFieldGet(this,k,"f")),__classPrivateFieldGet(this,k,"f").style.display="none",this.margin=n,this.renderingConfiguration=s,__classPrivateFieldGet(this,w,"m",re).call(this),__classPrivateFieldGet(this,w,"m",$).call(this),this.renderingConfiguration.smartGuide.fadeOut.enable&&__classPrivateFieldGet(this,w,"m",U).call(this,this.renderingConfiguration.smartGuide.fadeOut.duration),this.resize()}resize(){const i=3.779527559,n=this.margin.top*i,s=this.margin.left*i,a=this.margin.right*i,l=n-45.354330708;__classPrivateFieldGet(this,S,"f").style.top=`${l}px`,__classPrivateFieldGet(this,S,"f").style.left=`${s}px`,__classPrivateFieldGet(this,S,"f").style.right=`${a}px`;let d=__classPrivateFieldGet(this,C,"f").offsetWidth;__classPrivateFieldGet(this,x,"f").style.marginLeft=`${d}px`,__classPrivateFieldGet(this,x,"f").style.width=__classPrivateFieldGet(this,S,"f").clientWidth-__classPrivateFieldGet(this,C,"f").offsetWidth-__classPrivateFieldGet(this,E,"f").offsetHeight+"px",d+=__classPrivateFieldGet(this,x,"f").offsetWidth,__classPrivateFieldGet(this,M,"f").style.left=`${d-__classPrivateFieldGet(this,M,"f").offsetWidth+__classPrivateFieldGet(this,E,"f").offsetWidth}px`,__classPrivateFieldGet(this,M,"f").style.top=`${__classPrivateFieldGet(this,E,"f").offsetHeight}px`,__classPrivateFieldGet(this,E,"f").style.left=`${d}px`}update(i){var n,s;this.jiix=i;const createWordSpan=(i,n)=>{const s=document.createElement("span");return s.id=`word-${i}${this.uuid}`,n?s.textContent=n.label:s.innerHTML=" ",s};(()=>{var i;if(__classPrivateFieldGet(this,b,"f").innerHTML="",null===(i=this.jiix)||void 0===i?void 0:i.words){const i=this.jiix.words,n=document.createDocumentFragment();i.forEach(((s,a)=>{var l,d;if(" "===s.label||s.label.includes("\n"))n.appendChild(createWordSpan(a));else if(a!==i.length-1)n.appendChild(createWordSpan(a,s));else{__classPrivateFieldGet(this,b,"f").appendChild(n),this.lastWord&&(this.lastWord=s);const i=createWordSpan(a,s);(null===(l=this.lastWord)||void 0===l?void 0:l.candidates)!==s.candidates&&(null===(d=this.lastWord)||void 0===d?void 0:d.label)!==s.label?(i.classList.add("added-word"),__classPrivateFieldGet(this,b,"f").appendChild(i),__classPrivateFieldGet(this,x,"f").scrollLeft=i.offsetLeft,this.lastWord=s):(__classPrivateFieldGet(this,b,"f").appendChild(i),__classPrivateFieldGet(this,x,"f").scrollLeft=i.offsetLeft)}}))}})(),(null===(s=null===(n=this.jiix)||void 0===n?void 0:n.words)||void 0===s?void 0:s.length)&&__classPrivateFieldGet(this,w,"m",$).call(this)}clear(){__classPrivateFieldGet(this,b,"f").innerHTML="",__classPrivateFieldGet(this,k,"f").innerHTML="",__classPrivateFieldGet(this,w,"m",J).call(this)}destroy(){__classPrivateFieldGet(this,S,"f").innerHTML=""}}S=new WeakMap,x=new WeakMap,b=new WeakMap,E=new WeakMap,C=new WeakMap,k=new WeakMap,M=new WeakMap,G=new WeakMap,T=new WeakMap,L=new WeakMap,I=new WeakMap,D=new WeakMap,V=new WeakMap,K=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ie=new WeakMap,ne=new WeakMap,se=new WeakMap,w=new WeakSet,A=function _SmartGuide_createWrapperElement(){__classPrivateFieldSet(this,S,document.createElement("div"),"f"),__classPrivateFieldGet(this,S,"f").id=`smartguide-${this.uuid}`,__classPrivateFieldGet(this,S,"f").classList.add("smartguide")},R=function _SmartGuide_createPrompterContainerElement(){__classPrivateFieldSet(this,x,document.createElement("div"),"f"),__classPrivateFieldGet(this,x,"f").id=`prompter-container-${this.uuid}`,__classPrivateFieldGet(this,x,"f").classList.add("prompter-container")},O=function _SmartGuide_createPrompterTextElement(){__classPrivateFieldSet(this,b,document.createElement("div"),"f"),__classPrivateFieldGet(this,b,"f").id=`prompter-text-${this.uuid}`,__classPrivateFieldGet(this,b,"f").classList.add("prompter-text"),__classPrivateFieldGet(this,b,"f").setAttribute("touch-action","none")},N=function _SmartGuide_createEllipsisElement(){__classPrivateFieldSet(this,E,document.createElement("div"),"f"),__classPrivateFieldGet(this,E,"f").id=`ellipsis-${this.uuid}`,__classPrivateFieldGet(this,E,"f").classList.add("ellipsis"),__classPrivateFieldGet(this,E,"f").innerHTML="..."},W=function _SmartGuide_createTagElement(){__classPrivateFieldSet(this,C,document.createElement("div"),"f"),__classPrivateFieldGet(this,C,"f").id=`tag-icon-${this.uuid}`,__classPrivateFieldGet(this,C,"f").classList.add("tag-icon"),__classPrivateFieldGet(this,C,"f").innerHTML="¶"},z=function _SmartGuide_createCandidatesElement(){__classPrivateFieldSet(this,k,document.createElement("div"),"f"),__classPrivateFieldGet(this,k,"f").id=`candidates-${this.uuid}`,__classPrivateFieldGet(this,k,"f").classList.add("candidates")},j=function _SmartGuide_createMoreMenuElement(){__classPrivateFieldSet(this,M,document.createElement("div"),"f"),__classPrivateFieldGet(this,M,"f").id=`more-menu-${this.uuid}`,__classPrivateFieldGet(this,M,"f").classList.add("more-menu")},H=function _SmartGuide_createConvertElement(){__classPrivateFieldSet(this,G,document.createElement("button"),"f"),__classPrivateFieldGet(this,G,"f").id=`convert-${this.uuid}`,__classPrivateFieldGet(this,G,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,G,"f").innerHTML="Convert"},X=function _SmartGuide_createCopyElement(){__classPrivateFieldSet(this,T,document.createElement("button"),"f"),__classPrivateFieldGet(this,T,"f").id=`copy-${this.uuid}`,__classPrivateFieldGet(this,T,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,T,"f").innerHTML="Copy"},B=function _SmartGuide_createDeleteElement(){__classPrivateFieldSet(this,L,document.createElement("button"),"f"),__classPrivateFieldGet(this,L,"f").id=`delete-${this.uuid}`,__classPrivateFieldGet(this,L,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,L,"f").innerHTML="Delete"},U=function _SmartGuide_initFadeOutObserver(i=3e3){new MutationObserver((()=>{clearTimeout(__classPrivateFieldGet(this,I,"f")),__classPrivateFieldGet(this,S,"f").classList.contains("smartguide-out")||"none"!==__classPrivateFieldGet(this,k,"f").style.display||__classPrivateFieldGet(this,D,"f")||__classPrivateFieldSet(this,I,setTimeout((()=>{__classPrivateFieldGet(this,w,"m",J).call(this)}),i),"f")})).observe(__classPrivateFieldGet(this,S,"f"),{childList:!0,subtree:!0,attributes:!0})},$=function _SmartGuide_show(){__classPrivateFieldGet(this,S,"f").classList.remove("smartguide-out"),__classPrivateFieldGet(this,S,"f").classList.add("smartguide-in")},J=function _SmartGuide_hide(){__classPrivateFieldGet(this,S,"f").classList.add("smartguide-out"),__classPrivateFieldGet(this,S,"f").classList.remove("smartguide-in")},Y=function _SmartGuide_hideCandidates(){__classPrivateFieldGet(this,k,"f").style.display="none"},q=function _SmartGuide_openMenu(){__classPrivateFieldGet(this,M,"f").classList.add("open"),__classPrivateFieldGet(this,M,"f").classList.remove("close"),__classPrivateFieldSet(this,D,!0,"f")},Z=function _SmartGuide_closeMenu(){__classPrivateFieldGet(this,M,"f").classList.add("close"),__classPrivateFieldGet(this,M,"f").classList.remove("open"),__classPrivateFieldSet(this,D,!1,"f")},re=function _SmartGuide_addListeners(){__classPrivateFieldGet(this,E,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,K,"f").call(this,i))),__classPrivateFieldGet(this,G,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,Q,"f").call(this,i))),__classPrivateFieldGet(this,T,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,ee,"f").call(this,i))),__classPrivateFieldGet(this,L,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,te,"f").call(this,i))),__classPrivateFieldGet(this,b,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,ne,"f").call(this,i))),__classPrivateFieldGet(this,k,"f").addEventListener("pointerdown",(i=>__classPrivateFieldGet(this,ie,"f").call(this,i))),document.addEventListener("pointerdown",(()=>__classPrivateFieldGet(this,se,"f").call(this)))};class DeferredPromise{constructor(){this.isFullFilled=!1,this.isPending=!0,this.promise=new Promise(((i,n)=>{this.reject=i=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,n(i)})),this.resolve=n=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,i(n)}))}))}}class PointerEventGrabber{constructor(i){this.prevent=i=>i.preventDefault(),this.pointerDownHandler=i=>{if(0===i.button&&1===i.buttons&&(this.activePointerId=i.pointerId,this.onPointerDown)){const n=this.extractPoint(i);this.onPointerDown(i,n)}},this.pointerMoveHandler=i=>{if(null!=this.activePointerId&&this.activePointerId===i.pointerId&&this.onPointerMove){const n=this.extractPoint(i);this.onPointerMove(i,n)}},this.pointerUpHandler=i=>{if(null!=this.activePointerId&&this.activePointerId===i.pointerId&&(this.activePointerId=void 0,i.stopPropagation(),this.onPointerUp)){const n=this.extractPoint(i);this.onPointerUp(i,n)}},this.configuration=i}roundFloat(i,n){if(n>=0){const s=Math.pow(10,n);return Math.round(i/s)*s}return i}extractPoint(i){let n,s;({clientX:n,clientY:s}="changedTouches"in i?i.changedTouches[0]:i);const a=this.domElement.getBoundingClientRect();return{x:this.roundFloat(n-a.left-this.domElement.clientLeft,this.configuration.xyFloatPrecision),y:this.roundFloat(s-a.top-this.domElement.clientTop,this.configuration.xyFloatPrecision),t:this.roundFloat(Date.now(),this.configuration.timestampFloatPrecision),p:i.pressure||1}}attach(i){this.domElement&&this.detach(),this.domElement=i,this.domElement.addEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("touchmove",this.prevent),document.documentElement.addEventListener("pointerdown",(()=>{}))}detach(){var i,n,s,a,l,d;null===(i=this.domElement)||void 0===i||i.removeEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),null===(n=this.domElement)||void 0===n||n.removeEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),null===(s=this.domElement)||void 0===s||s.removeEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),null===(a=this.domElement)||void 0===a||a.removeEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),null===(l=this.domElement)||void 0===l||l.removeEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),null===(d=this.domElement)||void 0===d||d.removeEventListener("touchmove",this.prevent),document.documentElement.removeEventListener("pointerdown",(()=>{}))}}const ae={table:"table",shape:"shape",recognizedShape:"recognizedShape",ellipse:"ellipse",line:"line"};function phi(i){let n=(i+Math.PI)%(2*Math.PI)-Math.PI;return n<-Math.PI&&(n+=2*Math.PI),n}function drawArrowHead(i,n,s,a){const l=phi(s+Math.PI*(7/8)),d=phi(s-Math.PI*(7/8));i.save();try{i.fillStyle=i.strokeStyle,i.moveTo(n.x,n.y),i.beginPath(),i.lineTo(n.x+a*Math.cos(l),n.y+a*Math.sin(l)),i.lineTo(n.x+a*Math.cos(d),n.y+a*Math.sin(d)),i.lineTo(n.x,n.y),i.fill()}finally{i.restore()}}function drawShapeEllipse(i,n){const s=function drawEllipseArc(i,n){const{centerPoint:s,maxRadius:a,minRadius:l,orientation:d,startAngle:c,sweepAngle:h}=n;let u=Math.cos(d),p=Math.sin(d),v=u,m=p;u*=a,v*=l,p*=a,m*=l;const g=Math.floor(Math.abs(h)/.02),f=[];i.save();try{i.beginPath();for(let n=0;n<=g;n++){const d=c+n/g*h,_=Math.atan2(Math.sin(d)/l,Math.cos(d)/a),y=Math.cos(_),P=Math.sin(_),w=s.x+u*y-m*P,S=s.y+v*P+p*y;0===n?i.moveTo(w,S):i.lineTo(w,S),0!==n&&n!==g||f.push({x:w,y:S})}i.stroke()}finally{i.restore()}return f}(i,n);"ARROW_HEAD"===(null==n?void 0:n.beginDecoration)&&drawArrowHead(i,s[0],n.beginTangentAngle,12),"ARROW_HEAD"===(null==n?void 0:n.endDecoration)&&drawArrowHead(i,s[1],n.endTangentAngle,12)}function drawLine(i,n,s){i.save();try{i.beginPath(),i.moveTo(n.x,n.y),i.lineTo(s.x,s.y),i.stroke()}finally{i.restore()}}function drawShapeSymbol(i,n){i.save();try{if(i.lineWidth=n.style.width,i.strokeStyle=n.style.color,n.elementType)switch(n.elementType){case ae.shape:{const s=n;drawShapeSymbol(i,s.candidates[s.selectedCandidateIndex]);break}case ae.table:n.lines.forEach((n=>drawShapeSymbol(i,n)));break;case ae.line:{const s=n;drawLine(i,s.data.p1,s.data.p2);break}}else switch(n.type){case ae.ellipse:drawShapeEllipse(i,n);break;case ae.line:!function drawShapeLine(i,n){drawLine(i,n.firstPoint,n.lastPoint),"ARROW_HEAD"===n.beginDecoration&&drawArrowHead(i,n.firstPoint,n.beginTangentAngle,12),"ARROW_HEAD"===n.endDecoration&&drawArrowHead(i,n.lastPoint,n.endTangentAngle,12)}(i,n);break;case ae.recognizedShape:n.primitives.forEach((n=>drawShapeSymbol(i,n)));break}}finally{i.restore()}}var le=Object.freeze({__proto__:null,ShapeSymbols:ae,drawLine:drawLine,drawShapeSymbol:drawShapeSymbol});function drawStroke(i,n,s){s&&n&&"eraser"!==n.pointerType&&s.drawStroke(i,n)}var de=Object.freeze({__proto__:null,drawStroke:drawStroke});const ce={inputCharacter:"inputCharacter",char:"char",string:"string",textLine:"textLine"};function drawTextLine(i,n){!function drawText(i,n,s){i.save();try{i.font=`${s.textHeight}px serif`,i.textAlign="CENTER"===s.justificationType?"center":"left",i.textBaseline="bottom",i.fillStyle=i.strokeStyle,i.fillText(n,s.topLeftPoint.x,s.topLeftPoint.y+s.height)}finally{i.restore()}}(i,n.label,n.data),n.underlineList.forEach((s=>{!function drawUnderline(i,n,s,a){const l=a.width/s.length;drawLine(i,{x:a.topLeftPoint.x+n.data.firstCharacter*l,y:a.topLeftPoint.y+a.height},{x:a.topLeftPoint.x+n.data.lastCharacter*l,y:a.topLeftPoint.y+a.height})}(i,s,n.label,n.data)}))}function drawTextSymbol(i,n){i.save();try{i.lineWidth=n.style.width,i.strokeStyle=n.style.color;if((n.elementType||n.type)===ce.textLine)drawTextLine(i,n);else console.info(`drawTextSymbol => ${n.elementType} not implemented`)}finally{i.restore()}}var he=Object.freeze({__proto__:null,TextSymbols:ce,drawTextSymbol:drawTextSymbol});function computeLinksPoints(i,n,s){const a=i.p*s;return[{x:i.x-Math.sin(n)*a,y:i.y+Math.cos(n)*a},{x:i.x+Math.sin(n)*a,y:i.y-Math.cos(n)*a}]}function computeMiddlePoint(i,n){return{x:(n.x+i.x)/2,y:(n.y+i.y)/2,p:(n.p+i.p)/2,t:(n.t+i.t)/2}}function computeAxeAngle(i,n){return Math.atan2(n.y-i.y,n.x-i.x)}var ue=Object.freeze({__proto__:null,computeLinksPoints:computeLinksPoints,computeMiddlePoint:computeMiddlePoint,computeAxeAngle:computeAxeAngle});class CanvasStroker{renderArc(i,n,s){i.arc(n.x,n.y,s,0,2*Math.PI,!0)}renderLine(i,n,s,a){const l=computeLinksPoints(n,computeAxeAngle(n,s),a),d=computeLinksPoints(s,computeAxeAngle(n,s),a);i.moveTo(l[0].x,l[0].y),i.lineTo(d[0].x,d[0].y),i.lineTo(d[1].x,d[1].y),i.lineTo(l[1].x,l[1].y)}renderFinal(i,n,s,a){const l=computeAxeAngle(n,s),d=computeLinksPoints(s,l,a);i.moveTo(d[0].x,d[0].y);for(let n=1;n<=6;n++){const d=l-n*Math.PI/6;i.lineTo(s.x-s.p*a*Math.sin(d),s.y+s.p*a*Math.cos(d))}}renderQuadratic(i,n,s,a,l){const d=computeLinksPoints(n,computeAxeAngle(n,a),l),c=computeLinksPoints(s,computeAxeAngle(a,s),l),h=computeLinksPoints(a,computeAxeAngle(n,s),l);i.moveTo(d[0].x,d[0].y),i.quadraticCurveTo(h[0].x,h[0].y,c[0].x,c[0].y),i.lineTo(c[1].x,c[1].y),i.quadraticCurveTo(h[1].x,h[1].y,d[1].x,d[1].y)}drawStroke(i,n){const s=n.pointers.length,a=s-2,l=n.style.width>0?n.style.width:i.lineWidth,d=n.style.color?n.style.color:i.strokeStyle,c=n.pointers[0];i.save();try{if(i.beginPath(),s<3)this.renderArc(i,c,.6*l);else{this.renderArc(i,c,l*c.p);const d=computeMiddlePoint(c,n.pointers[1]);this.renderLine(i,c,d,l);for(let s=0;s{var s;const a=n.parentNode,l=Math.max(this.config.minWidth,a.clientWidth),d=Math.max(this.config.minHeight,a.clientHeight);n.width=l*i,n.height=d*i,null===(s=n.getContext("2d"))||void 0===s||s.scale(i,i),n.style.width=`${l}px`,n.style.height=`${d}px`}))}drawSymbol(i,n){const s=n.elementType||n.type;"stroke"===s?drawStroke(i,n,this.stroker):Object.keys(ce).includes(s)?drawTextSymbol(i,n):Object.keys(ae).includes(s)&&drawShapeSymbol(i,n)}init(i){const n=this.createCanvas("ms-rendering-canvas");i.appendChild(n);const s=this.createCanvas("ms-capture-canvas");i.appendChild(s),this.context={parent:i,renderingCanvas:n,renderingCanvasContext:n.getContext("2d"),capturingCanvas:s,capturingCanvasContext:s.getContext("2d")},this.resizeContent()}drawModel(i){var n;null===(n=this.context.renderingCanvasContext)||void 0===n||n.clearRect(0,0,this.context.renderingCanvas.width,this.context.renderingCanvas.height),i.rawStrokes.forEach((i=>this.drawSymbol(this.context.renderingCanvasContext,i))),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height)}drawPendingStroke(i){this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height),i&&"eraser"!==(null==i?void 0:i.pointerType)&&this.stroker.drawStroke(this.context.capturingCanvasContext,i)}resize(i){this.resizeContent(),this.drawModel(i)}destroy(){this.context.parent&&(this.context.parent.innerHTML="")}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function createCommonjsModule(i,n){return i(n={exports:{}},n.exports),n.exports}var pe=createCommonjsModule((function(i,n){i.exports=function(i){function e(s){if(n[s])return n[s].exports;var a=n[s]={i:s,l:!1,exports:{}};return i[s].call(a.exports,a,a.exports,e),a.l=!0,a.exports}var n={};return e.m=i,e.c=n,e.i=function(i){return i},e.d=function(i,n,s){e.o(i,n)||Object.defineProperty(i,n,{configurable:!1,enumerable:!0,get:s})},e.n=function(i){var n=i&&i.__esModule?function(){return i.default}:function(){return i};return e.d(n,"a",n),n},e.o=function(i,n){return Object.prototype.hasOwnProperty.call(i,n)},e.p="",e(e.s=1)}([function(i,n,s){function o(i,n){if(!(i instanceof n))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},l=function t(i){var n=this;o(this,t),this.toJSON=function(i){if("string"!=typeof i)return console.error("Need a CSS string but given ",void 0===i?"undefined":a(i),i),"Not a valid CSS..!";var s={},l=void 0,d=void 0,c=void 0;try{i.split("{").forEach((function(i){if(d=i.trim())if(-1===d.indexOf("}"))s[d]={},l=d;else{d.substring(0,d.indexOf("}")).split(";").forEach((function(i){(c=i.split(":"))&&2===c.length&&(s[l][c[0].trim().replace(/^\"|\"$/g,"")]=n._trimSemiColon(c[1].trim().replace(/^\"|\"$/g,"")))}));try{(l=d.split("}")[1].trim())&&(s[l]={})}catch(i){}}}))}catch(i){return"Not a valid CSS..!"}return s},this.toCSS=function(i){if("object"!==(void 0===i?"undefined":a(i)))return console.error("Need a JSON object but given ",void 0===i?"undefined":a(i),i),"Not a valid JSON..!";var n="";try{for(var s in i)if(i.hasOwnProperty(s)){for(var l in n+=s+" {\n",i[s])i[s].hasOwnProperty(l)&&(n+=l+": "+i[s][l]+";\n");n+="}\n"}}catch(i){return"Not a valid JSON..!"}return n},this._trimSemiColon=function(i){return";"===i.slice(-1)?i.slice(0,n.length-1):i}};n.default=l},function(i,n,s){i.exports=s(0).default}])})),ve=function unwrapExports(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}(pe);pe.JsonCSS;const me=new ve;var ge={themeToCSS:i=>me.toCSS(i),themeToJSON(i){const n=me.toJSON(i);return n[".text"]["font-size"]=Number(n[".text"]["font-size"]),n.ink["-myscript-pen-width"]=Number(n.ink["-myscript-pen-width"]),n.ink.width=Number(n.ink.width),n},penStyleToCSS(i){let n=me.toCSS({css:i});return n=n.substring(6,n.length-3),n},penStyleToJSON(i){const n=me.toJSON(`css {${i}}`).css;return n.width?n.width=Number(n.width):delete n.width,n["-myscript-pen-width"]?n["-myscript-pen-width"]=Number(n["-myscript-pen-width"]):delete n["-myscript-pen-width"],n},stringToJSON:i=>me.toJSON(`css {${i}}`).css,JSONToString:i=>Object.entries(i).map((([i,n])=>`${i}:${n}`)).join(";")},fe=createCommonjsModule((function(i,n){var s;i.exports=(s=s||function(i,n){var s=Object.create||function(){function F(){}return function(i){var n;return F.prototype=i,n=new F,F.prototype=null,n}}(),a={},l=a.lib={},d=l.Base={extend:function(i){var n=s(this);return i&&n.mixIn(i),n.hasOwnProperty("init")&&this.init!==n.init||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var i=this.extend();return i.init.apply(i,arguments),i},init:function(){},mixIn:function(i){for(var n in i)i.hasOwnProperty(n)&&(this[n]=i[n]);i.hasOwnProperty("toString")&&(this.toString=i.toString)},clone:function(){return this.init.prototype.extend(this)}},c=l.WordArray=d.extend({init:function(i,s){i=this.words=i||[],this.sigBytes=s!=n?s:4*i.length},toString:function(i){return(i||u).stringify(this)},concat:function(i){var n=this.words,s=i.words,a=this.sigBytes,l=i.sigBytes;if(this.clamp(),a%4)for(var d=0;d>>2]>>>24-d%4*8&255;n[a+d>>>2]|=c<<24-(a+d)%4*8}else for(d=0;d>>2]=s[d>>>2];return this.sigBytes+=l,this},clamp:function(){var n=this.words,s=this.sigBytes;n[s>>>2]&=4294967295<<32-s%4*8,n.length=i.ceil(s/4)},clone:function(){var i=d.clone.call(this);return i.words=this.words.slice(0),i},random:function(n){for(var s,a=[],r=function(n){var s=987654321,a=4294967295;return function(){var l=((s=36969*(65535&s)+(s>>16)&a)<<16)+(n=18e3*(65535&n)+(n>>16)&a)&a;return l/=4294967296,(l+=.5)*(i.random()>.5?1:-1)}},l=0;l>>2]>>>24-l%4*8&255;a.push((d>>>4).toString(16)),a.push((15&d).toString(16))}return a.join("")},parse:function(i){for(var n=i.length,s=[],a=0;a>>3]|=parseInt(i.substr(a,2),16)<<24-a%8*4;return new c.init(s,n/2)}},p=h.Latin1={stringify:function(i){for(var n=i.words,s=i.sigBytes,a=[],l=0;l>>2]>>>24-l%4*8&255;a.push(String.fromCharCode(d))}return a.join("")},parse:function(i){for(var n=i.length,s=[],a=0;a>>2]|=(255&i.charCodeAt(a))<<24-a%4*8;return new c.init(s,n)}},v=h.Utf8={stringify:function(i){try{return decodeURIComponent(escape(p.stringify(i)))}catch(i){throw new Error("Malformed UTF-8 data")}},parse:function(i){return p.parse(unescape(encodeURIComponent(i)))}},m=l.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(i){"string"==typeof i&&(i=v.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes},_process:function(n){var s=this._data,a=s.words,l=s.sigBytes,d=this.blockSize,h=l/(4*d),u=(h=n?i.ceil(h):i.max((0|h)-this._minBufferSize,0))*d,p=i.min(4*u,l);if(u){for(var v=0;v>>1|ie<<31)^(te>>>8|ie<<24)^te>>>7,se=(ie>>>1|te<<31)^(ie>>>8|te<<24)^(ie>>>7|te<<25),re=u[q-2],oe=re.high,ae=re.low,le=(oe>>>19|ae<<13)^(oe<<3|ae>>>29)^oe>>>6,de=(ae>>>19|oe<<13)^(ae<<3|oe>>>29)^(ae>>>6|oe<<26),ce=u[q-7],he=ce.high,ue=ce.low,pe=u[q-16],ve=pe.high,me=pe.low;K=(K=(K=ne+he+((Q=se+ue)>>>0>>0?1:0))+le+((Q+=de)>>>0>>0?1:0))+ve+((Q+=me)>>>0>>0?1:0),Z.high=K,Z.low=Q}var ge,fe=H&B^~H&$,_e=X&U^~X&J,ye=D&R^D&N^R&N,Pe=A&O^A&W^O&W,we=(D>>>28|A<<4)^(D<<30|A>>>2)^(D<<25|A>>>7),Se=(A>>>28|D<<4)^(A<<30|D>>>2)^(A<<25|D>>>7),xe=(H>>>14|X<<18)^(H>>>18|X<<14)^(H<<23|X>>>9),be=(X>>>14|H<<18)^(X>>>18|H<<14)^(X<<23|H>>>9),Ee=h[q],Ce=Ee.high,ke=Ee.low,Fe=V+xe+((ge=Y+be)>>>0>>0?1:0),Me=Se+Pe;V=$,Y=J,$=B,J=U,B=H,U=X,H=z+(Fe=(Fe=(Fe=Fe+fe+((ge+=_e)>>>0<_e>>>0?1:0))+Ce+((ge+=ke)>>>0>>0?1:0))+K+((ge+=Q)>>>0>>0?1:0))+((X=j+ge|0)>>>0>>0?1:0)|0,z=N,j=W,N=R,W=O,R=D,O=A,D=Fe+(we+ye+(Me>>>0>>0?1:0))+((A=ge+Me|0)>>>0>>0?1:0)|0}_=a.low=_+A,a.high=f+D+(_>>>0>>0?1:0),P=l.low=P+O,l.high=y+R+(P>>>0>>0?1:0),S=d.low=S+W,d.high=w+N+(S>>>0>>0?1:0),b=c.low=b+j,c.high=x+z+(b>>>0>>0?1:0),C=p.low=C+X,p.high=E+H+(C>>>0>>0?1:0),M=v.low=M+U,v.high=k+B+(M>>>0>>0?1:0),T=m.low=T+J,m.high=G+$+(T>>>0>>0?1:0),I=g.low=I+Y,g.high=L+V+(I>>>0>>0?1:0)},_doFinalize:function(){var i=this._data,n=i.words,s=8*this._nDataBytes,a=8*i.sigBytes;return n[a>>>5]|=128<<24-a%32,n[30+(a+128>>>10<<5)]=Math.floor(s/4294967296),n[31+(a+128>>>10<<5)]=s,i.sigBytes=4*n.length,this._process(),this._hash.toX32()},clone:function(){var i=n.clone.call(this);return i._hash=this._hash.clone(),i},blockSize:32});i.SHA512=n._createHelper(p),i.HmacSHA512=n._createHmacHelper(p)}(),s.SHA512)})),createCommonjsModule((function(i,n){var s,a,l;i.exports=(a=(s=fe).lib.Base,l=s.enc.Utf8,void(s.algo.HMAC=a.extend({init:function(i,n){i=this._hasher=new i.init,"string"==typeof n&&(n=l.parse(n));var s=i.blockSize,a=4*s;n.sigBytes>a&&(n=i.finalize(n)),n.clamp();for(var d=this._oKey=n.clone(),c=this._iKey=n.clone(),h=d.words,u=c.words,p=0;p{const s=i.split("."),a=n.split(".");for(let i=0;il)return!1;if(n{n.p.push(i.p),n.t.push(i.t),n.x.push(i.x),n.y.push(i.y)})),n}class RestRecognizer{constructor(i,n){this.serverConfiguration=i,this.recognitionConfiguration=n}get url(){return`${this.serverConfiguration.scheme}://${this.serverConfiguration.host}/api/v4.0/iink/batch`}get postConfig(){switch(this.recognitionConfiguration.type){case"DIAGRAM":return{lang:this.recognitionConfiguration.lang,diagram:this.recognitionConfiguration.diagram,export:this.recognitionConfiguration.export};case"MATH":return{lang:this.recognitionConfiguration.lang,math:this.recognitionConfiguration.math,export:this.recognitionConfiguration.export};case"Raw Content":return{lang:this.recognitionConfiguration.lang,"raw-content":this.recognitionConfiguration["raw-content"],export:this.recognitionConfiguration.export};case"TEXT":return{lang:this.recognitionConfiguration.lang,text:this.recognitionConfiguration.text,export:this.recognitionConfiguration.export};default:throw new Error(`get postConfig error Recognition type unkow "${this.recognitionConfiguration.type}"`)}}buildData(i){const n=[];i.rawStrokes.forEach((i=>{const s=n.findIndex((n=>{return s=n.penStyle,a=i.style,s["-myscript-pen-fill-color"]===a["-myscript-pen-fill-color"]&&s["-myscript-pen-fill-style"]===a["-myscript-pen-fill-style"]&&s["-myscript-pen-width"]===a["-myscript-pen-width"]&&s.color===a.color&&s.width===a.width;var s,a}));s>-1?n[s].strokes.push(i):n.push({penStyle:i.style,strokes:[i]})}));const s=[];n.forEach((i=>{const n={penStyle:"{}"===JSON.stringify(i.penStyle)?void 0:ge.penStyleToCSS(i.penStyle),strokes:i.strokes.map(convertStrokeToJSON)};s.push(n)}));const a="Raw Content"===this.recognitionConfiguration.type?"Raw Content":this.recognitionConfiguration.type.charAt(0).toUpperCase()+this.recognitionConfiguration.type.slice(1).toLowerCase();return{configuration:this.postConfig,xDPI:96,yDPI:96,contentType:a,height:i.height,width:i.width,strokeGroups:s}}post(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=new Headers;s.append("Accept","application/json,"+n),s.append("applicationKey",this.serverConfiguration.applicationKey),s.append("hmac",computeHmac(JSON.stringify(i),this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)),s.append("Content-Type","application/json"),isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(s.append("myscript-client-name","iink-ts"),s.append("myscript-client-version","1.0.0-buildVersion"));const a={method:"POST",headers:s,body:JSON.stringify(i)},l=new Request(this.url,a),d=yield fetch(l);if(d.ok){let i;switch(d.headers.get("content-type")){case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"image/png":case"image/jpeg":i=yield d.blob();break;case"application/json":i=yield d.json();break;case"application/vnd.myscript.jiix":i=yield d.clone().json().catch((()=>__awaiter(this,void 0,void 0,(function*(){return yield d.text()}))));break;default:i=yield d.text()}return i}throw yield d.json()}))}tryFetch(i,s){return __awaiter(this,void 0,void 0,(function*(){return this.post(i,s).then((i=>{const n={};return n[s]=i,n})).catch((i=>{let s=i.message||n.UNKNOW;i.code?"access.not.granted"===i.code&&(s=n.WRONG_CREDENTIALS):s=n.CANT_ESTABLISH;throw new Error(s)}))}))}getMimeTypes(i){let n=i||[];if(!n.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":n=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":n=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":n=["application/vnd.myscript.jiix"];break;case"TEXT":n=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}return n}convert(i,n,s){return __awaiter(this,void 0,void 0,(function*(){const a=i.getClone(),l=this.getMimeTypes(s),d=this.buildData(a);d.conversionState=n;const c=l.map((i=>this.tryFetch(d,i)));return(yield Promise.all(c)).forEach((i=>{a.mergeConvert(i)})),a}))}export(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=i.getClone();if(0===s.rawStrokes.length)return Promise.resolve(s);const a=this.getMimeTypes(n);if(!a.length)return Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration"));const l=a.filter((i=>!s.exports||!s.exports[i])),d=this.buildData(i);return(yield Promise.all(l.map((i=>this.tryFetch(d,i))))).forEach((i=>{s.mergeExport(i)})),s}))}resize(i){return __awaiter(this,void 0,void 0,(function*(){return this.export(i)}))}}class UndoRedoContext{constructor(i){this.stackIndex=0,this.possibleUndoCount=0,this.canRedo=!1,this.canUndo=!1,this.empty=!0,this.stack=[i.getClone()]}}class UndoRedoManager{constructor(i,n){this.configuration=i,this.context=new UndoRedoContext(n)}get internalEvent(){return InternalEvent.getInstance()}updateCanUndoRedo(){this.context.canRedo=this.context.stack.length-1>this.context.stackIndex,this.context.canUndo=this.context.stackIndex>0;const i=this.context.stack[this.context.stackIndex];this.context.empty=0===i.rawStrokes.length}addModelToStack(i){this.context.stackIndex+1this.configuration.maxStackSize&&(this.context.stack.shift(),this.context.stackIndex--),this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)}removeLastModelInStack(){this.context.stackIndex===this.context.stack.length-1&&this.context.stackIndex--,this.context.stack.pop(),this.updateCanUndoRedo()}updateModelInStack(i){const n=this.context.stack.findIndex((n=>n.modificationDate===i.modificationDate));n>-1&&this.context.stack.splice(n,1,i.getClone()),this.internalEvent.emitContextChange(this.context)}undo(){return this.context.canUndo&&(this.context.stackIndex--,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)),this.context.stack[this.context.stackIndex].getClone()}redo(){return this.context.canRedo&&(this.context.stackIndex++,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)),this.context.stack[this.context.stackIndex].getClone()}reset(i){this.context=new UndoRedoContext(i),this.internalEvent.emitContextChange(this.context)}}const mergeDeep=(i,...n)=>{const isObject=i=>i&&"object"==typeof i&&!Array.isArray(i);if(!n.length)return i;const s=n.shift();if(isObject(i)&&isObject(s))for(const n in s)isObject(s[n])?(i[n]||Object.assign(i,{[n]:{}}),mergeDeep(i[n],s[n])):Object.assign(i,{[n]:s[n]});return mergeDeep(i,...n)},we={},Se={ink:{color:"#000000",width:1,"-myscript-pen-width":1,"-myscript-pen-fill-style":"none","-myscript-pen-fill-color":"#FFFFFF00"},".math":{"font-family":"STIXGeneral"},".math-solved":{"font-family":"STIXGeneral",color:"#A8A8A8FF"},".text":{"font-family":"MyScriptInter","font-size":10}};var xe,be,Ee,Ce;class StyleManager{constructor(i,n){xe.set(this,void 0),be.set(this,void 0),Ee.set(this,void 0),Ce.set(this,void 0),this.setTheme(n),this.setPenStyleClasses(),this.setPenStyle(i)}get currentPenStyle(){return __classPrivateFieldGet(this,Ce,"f")||__classPrivateFieldGet(this,xe,"f")}get penStyle(){return __classPrivateFieldGet(this,xe,"f")}setPenStyle(i){__classPrivateFieldSet(this,xe,mergeDeep(structuredClone(we),i||{}),"f"),__classPrivateFieldSet(this,Ce,i||this.theme[`.${__classPrivateFieldGet(this,Ee,"f")}`],"f")}get theme(){return __classPrivateFieldGet(this,be,"f")}setTheme(i){__classPrivateFieldSet(this,be,mergeDeep(structuredClone(Se),i||{}),"f")}get penStyleClasses(){return __classPrivateFieldGet(this,Ee,"f")}setPenStyleClasses(i=""){__classPrivateFieldSet(this,Ee,i,"f"),__classPrivateFieldSet(this,Ce,this.theme[`.${__classPrivateFieldGet(this,Ee,"f")}`],"f")}}xe=new WeakMap,be=new WeakMap,Ee=new WeakMap,Ce=new WeakMap;const ke={protocol:"WEBSOCKET",scheme:"https",host:"cloud.myscript.com",applicationKey:"",hmacKey:"",version:"2.1.0",useWindowLocation:!1,websocket:{pingEnabled:!0,pingDelay:3e4,maxPingLostCount:10,autoReconnect:!0,maxRetryCount:2,fileChunkSize:3e5}},Fe={type:"TEXT",alwaysConnected:!0,lang:"en_US",gesture:{enable:!0},export:{"image-resolution":300,jiix:{"bounding-box":!1,strokes:!1,text:{chars:!1,words:!0}}},renderer:{debug:{"draw-text-boxes":!1,"draw-image-boxes":!1}},math:{mimeTypes:["application/vnd.myscript.jiix"],solver:{enable:!0,"fractional-part-digits":3,"decimal-separator":".","rounding-mode":"half up","angle-unit":"deg"},margin:{bottom:10,left:15,right:15,top:10},eraser:{"erase-precisely":!1},"undo-redo":{mode:"stroke"}},text:{guides:{enable:!0},mimeTypes:["application/vnd.myscript.jiix"],margin:{top:20,left:10,right:10,bottom:10},eraser:{"erase-precisely":!1}},diagram:{mimeTypes:["application/vnd.myscript.jiix"],eraser:{"erase-precisely":!1},convert:{"match-text-size":!0}},"raw-content":{recognition:{text:!0,shape:!0},eraser:{"erase-precisely":!1}}},Me={listenerOptions:{capture:!1,passive:!0},xyFloatPrecision:0,timestampFloatPrecision:0},Ge={minHeight:100,minWidth:100,smartGuide:{enable:!0,fadeOut:{enable:!1,duration:5e3}},guides:{enable:!0,gap:50}},Te={exportContent:"POINTER_UP",exportContentDelay:1e3,resizeTriggerDelay:100},Le={processDelay:10},Ie={maxStackSize:100},De={server:ke,recognition:Fe,grabber:Me,rendering:Ge,triggers:Te,events:Le,"undo-redo":Ie};class Configuration{constructor(i){this.events=JSON.parse(JSON.stringify(De.events)),this.grabber=JSON.parse(JSON.stringify(De.grabber)),this.recognition=JSON.parse(JSON.stringify(De.recognition)),this.rendering=JSON.parse(JSON.stringify(De.rendering)),this.server=JSON.parse(JSON.stringify(De.server)),this.triggers=JSON.parse(JSON.stringify(De.triggers)),this.overrideDefaultConfiguration(i)}overrideDefaultConfiguration(i){var n,s,a,l,d,c,h;const u=JSON.parse(JSON.stringify(De));this.events=mergeDeep({},u.events,null==i?void 0:i.events),this.grabber=mergeDeep({},u.grabber,null==i?void 0:i.grabber),this.recognition=mergeDeep({},u.recognition,null==i?void 0:i.recognition),this.rendering=mergeDeep({},u.rendering,null==i?void 0:i.rendering),this.server=mergeDeep({},u.server,null==i?void 0:i.server),this.triggers=mergeDeep({},u.triggers,null==i?void 0:i.triggers),this["undo-redo"]=mergeDeep({},u["undo-redo"],null==i?void 0:i["undo-redo"]),this.recognition.text.mimeTypes=(null===(s=null===(n=null==i?void 0:i.recognition)||void 0===n?void 0:n.text)||void 0===s?void 0:s.mimeTypes)||u.recognition.text.mimeTypes,this.recognition.math.mimeTypes=(null===(l=null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.math)||void 0===l?void 0:l.mimeTypes)||u.recognition.math.mimeTypes,this.recognition.diagram.mimeTypes=(null===(c=null===(d=null==i?void 0:i.recognition)||void 0===d?void 0:d.diagram)||void 0===c?void 0:c.mimeTypes)||u.recognition.diagram.mimeTypes,(null===(h=this.server)||void 0===h?void 0:h.useWindowLocation)&&(this.server.scheme=window.location.protocol.indexOf("s")>-1?"https":"http",this.server.host=window.location.host),"REST"===this.server.protocol&&"POINTER_UP"===this.triggers.exportContent&&(this.triggers.exportContent="QUIET_PERIOD",this.triggers.exportContentDelay=Math.max(this.triggers.exportContentDelay,50)),"WEBSOCKET"===this.server.protocol&&"TEXT"===this.recognition.type?this.rendering.smartGuide.enable&&!this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix")&&this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix"):this.rendering.smartGuide.enable=!1}}function computeDistance(i,n){const s=Math.hypot(n.y-i.y,n.x-i.x);return isNaN(s)?0:s}var Ae,Re,Oe,Ne,We,ze,je,He,Xe,Be,Ue,$e,Je,Ve,Ye,qe,Ze,Ke,Qe,et=Object.freeze({__proto__:null,computeDistance:computeDistance});class Model{constructor(i=100,n=100,s=Date.now()){Ae.add(this),this.creationTime=s,this.modificationDate=s,this.width=i,this.height=n,this.rawStrokes=[],this.selectedStrokes=[],this.positions={lastSentPosition:0,lastReceivedPosition:0},this.idle=!0}mergeExport(i){this.exports?Object.assign(this.exports,i):this.exports=i}mergeConvert(i){this.converts?Object.assign(this.converts,i):this.converts=i}computePressure(i,n){let s=1;0===n?s=.5:i===n?s=1:i<10?s=.2+Math.pow(.1*i,.4):i>n-10&&(s=.2+Math.pow(.1*(n-i),.4));const a=s*Math.max(.1,1-.1*Math.sqrt(i));return isNaN(a)?.5:Math.round(100*a)/100}filterPointByAcquisitionDelta(i,n,s){const a=2+(i.style["-myscript-pen-width"]||0)/4;return!s||0===i.pointers.length||Math.abs(s.x-n.x)>=a||Math.abs(s.y-n.y)>=a}addPoint(i,n){const s=i.pointers.at(-1)||{p:1,t:0,x:0,y:0};if(this.filterPointByAcquisitionDelta(i,n,s)){const a=computeDistance(n,s);i.length+=a,n.p=this.computePressure(a,i.length),i.pointers.push(n)}}addStroke(i){this.rawStrokes.push(i)}extractUnsentStrokes(){return this.rawStrokes.slice(this.positions.lastSentPosition)}initCurrentStroke(i,n,s,a,l=96){if(a["-myscript-pen-width"]){const i=a["-myscript-pen-width"]*l/25.4;a.width=i/2}this.modificationDate=Date.now(),this.exports=void 0,this.converts=void 0,this.currentStroke=new Stroke(a,n,s),this.addPoint(this.currentStroke,i)}appendToCurrentStroke(i){this.currentStroke&&this.addPoint(this.currentStroke,i)}endCurrentStroke(i){this.currentStroke&&(this.addPoint(this.currentStroke,i),this.addStroke(this.currentStroke),this.currentStroke=void 0)}resetSelectedStrokes(){this.selectedStrokes=[]}appendSelectedStrokesFromPoint(i){__classPrivateFieldGet(this,Ae,"m",Re).call(this,i).forEach((i=>{this.selectedStrokes.includes(i)||this.selectedStrokes.push(i)}))}updateStroke(i){const n=this.rawStrokes.findIndex((n=>n.id===i.id));-1!==n&&this.rawStrokes.splice(n,1,i)}removeStroke(i){const n=this.rawStrokes.findIndex((n=>n.id===i));-1!==n&&this.rawStrokes.splice(n,1)}removeStrokesFromPoint(i){const n=__classPrivateFieldGet(this,Ae,"m",Re).call(this,i);return n.forEach((i=>{this.removeStroke(i.id)})),n.map((i=>i.id))}updatePositionSent(i=this.rawStrokes.length){this.positions.lastSentPosition=i}updatePositionReceived(){this.positions.lastReceivedPosition=this.positions.lastSentPosition}getClone(){const i=new Model(this.width,this.height,this.creationTime);return i.modificationDate=JSON.parse(JSON.stringify(this.modificationDate)),i.currentStroke=this.currentStroke?JSON.parse(JSON.stringify(this.currentStroke)):void 0,i.rawStrokes=JSON.parse(JSON.stringify(this.rawStrokes)),i.positions=JSON.parse(JSON.stringify(this.positions)),i.exports=this.exports?JSON.parse(JSON.stringify(this.exports)):void 0,i.converts=this.converts?JSON.parse(JSON.stringify(this.converts)):void 0,i.idle=this.idle,i}clear(){this.modificationDate=Date.now(),this.currentStroke=void 0,this.rawStrokes=[],this.positions.lastSentPosition=0,this.positions.lastReceivedPosition=0,this.exports=void 0,this.converts=void 0,this.idle=!0}}Ae=new WeakSet,Re=function _Model_getStrokeFromPoint(i){const isBetween=(i,n,s)=>i>=n&&i<=s,n=[];return this.rawStrokes.forEach((s=>{for(let a=0;a0&&(this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(this.model,i))).catch((i=>this.internalEvent.emitError(i))));else this.model.initCurrentStroke(n,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,n){if("erasing"===this.mode)this.model.removeStrokesFromPoint(n).length>0&&(this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ne,"f"),i))).catch((i=>this.internalEvent.emitError(i))));else this.model.appendToCurrentStroke(n),this.drawCurrentStroke()}onPointerUp(i,n){if("erasing"===this.mode)this.model.removeStrokesFromPoint(n).length>0&&(this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ne,"f"),i))).catch((i=>this.internalEvent.emitError(i))));else this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ne,"f"),i))).catch((i=>this.internalEvent.emitError(i)))}drawCurrentStroke(){this.renderer.drawPendingStroke(this.model.currentStroke)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){this.renderer.drawModel(this.model);const i=new DeferredPromise;if(this.undoRedoManager.addModelToStack(this.model),"DEMAND"!==__classPrivateFieldGet(this,Oe,"f").triggers.exportContent){clearTimeout(__classPrivateFieldGet(this,ze,"f"));let n=this.model.getClone();__classPrivateFieldSet(this,ze,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{n=yield this.recognizer.export(n),this.undoRedoManager.updateModelInStack(n),this.model.modificationDate===n.modificationDate&&(this.model.exports=n.exports),i.resolve(this.model)}catch(n){i.reject(n)}}))),"QUIET_PERIOD"===__classPrivateFieldGet(this,Oe,"f").triggers.exportContent?__classPrivateFieldGet(this,Oe,"f").triggers.exportContentDelay:0),"f")}else i.resolve(this.model);return yield i.promise,this.internalEvent.emitExported(this.model.exports),i.promise}))}export(i){return __awaiter(this,void 0,void 0,(function*(){const n=yield this.recognizer.export(this.model.getClone(),i);return this.model.modificationDate===n.modificationDate&&this.model.mergeExport(n.exports),this.undoRedoManager.updateModelInStack(n),this.model}))}convert(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=yield this.recognizer.convert(this.model,i,n);return Object.assign(__classPrivateFieldGet(this,Ne,"f"),s),this.model}))}resize(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=new DeferredPromise;this.model.height=i,this.model.width=n,this.renderer.resize(this.model),this.model.rawStrokes.length?(clearTimeout(__classPrivateFieldGet(this,We,"f")),__classPrivateFieldSet(this,We,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){const i=yield this.recognizer.resize(this.model);s.resolve(i)}))),__classPrivateFieldGet(this,Oe,"f").triggers.resizeTriggerDelay),"f")):s.resolve(this.model);const a=yield s.promise;return this.internalEvent.emitExported(a.exports),a}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldSet(this,Ne,this.undoRedoManager.undo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,Ne,"f")),__classPrivateFieldSet(this,Ne,yield this.recognizer.export(__classPrivateFieldGet(this,Ne,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,Ne,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,Ne,"f").exports),__classPrivateFieldGet(this,Ne,"f")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldSet(this,Ne,this.undoRedoManager.redo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,Ne,"f")),__classPrivateFieldSet(this,Ne,yield this.recognizer.export(__classPrivateFieldGet(this,Ne,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,Ne,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,Ne,"f").exports),__classPrivateFieldGet(this,Ne,"f")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.renderer.drawModel(this.model),this.internalEvent.emitExported(this.model.exports),this.model}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return this.grabber.detach(),this.renderer.destroy(),Promise.resolve()}))}}Oe=new WeakMap,Ne=new WeakMap,We=new WeakMap,ze=new WeakMap;class WSRecognizer{constructor(i,n){this.pingCount=0,this.reconnectionCount=0,this.serverConfiguration=i,this.recognitionConfiguration=n;const s="https"===this.serverConfiguration.scheme?"wss":"ws";this.url=`${s}://${this.serverConfiguration.host}/api/v4.0/iink/document?applicationKey=${this.serverConfiguration.applicationKey}`}get mimeTypes(){switch(this.recognitionConfiguration.type.toLocaleLowerCase()){case"text":return this.recognitionConfiguration.text.mimeTypes;case"math":return this.recognitionConfiguration.math.mimeTypes;case"diagram":return this.recognitionConfiguration.diagram.mimeTypes;default:return[]}}get internalEvent(){return InternalEvent.getInstance()}infinitePing(){this.pingCount++,this.serverConfiguration.websocket.maxPingLostCount{this.socket.readyState<=1&&(this.socket.send(JSON.stringify({type:"ping"})),this.infinitePing())}),this.serverConfiguration.websocket.pingDelay)}openCallback(){var i;null===(i=this.connected)||void 0===i||i.resolve();const n={type:this.sessionId?"restoreIInkSession":"newContentPackage",iinkSessionId:this.sessionId,applicationKey:this.serverConfiguration.applicationKey,xDpi:96,yDpi:96,viewSizeHeight:this.viewSizeHeight,viewSizeWidth:this.viewSizeWidth};isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(n["myscript-client-name"]="iink-ts",n["myscript-client-version"]="1.0.0-buildVersion"),this.send(n)}rejectDeferredPending(i){var n,s,a,l,d,c,h,u,p,v,m,g,f,_,y,P,w,S,x,b;(null===(n=this.connected)||void 0===n?void 0:n.isPending)&&(null===(s=this.connected)||void 0===s||s.reject(i)),(null===(a=this.initialized)||void 0===a?void 0:a.isPending)&&(null===(l=this.initialized)||void 0===l||l.reject(i)),(null===(d=this.addStrokeDeferred)||void 0===d?void 0:d.isPending)&&(null===(c=this.addStrokeDeferred)||void 0===c||c.reject(i)),(null===(h=this.exportDeferred)||void 0===h?void 0:h.isPending)&&(null===(u=this.exportDeferred)||void 0===u||u.reject(i)),(null===(p=this.convertDeferred)||void 0===p?void 0:p.isPending)&&(null===(v=this.convertDeferred)||void 0===v||v.reject(i)),(null===(m=this.importDeferred)||void 0===m?void 0:m.isPending)&&(null===(g=this.importDeferred)||void 0===g||g.reject(i)),(null===(f=this.resizeDeferred)||void 0===f?void 0:f.isPending)&&(null===(_=this.resizeDeferred)||void 0===_||_.reject(i)),(null===(y=this.undoDeferred)||void 0===y?void 0:y.isPending)&&(null===(P=this.undoDeferred)||void 0===P||P.reject(i)),(null===(w=this.redoDeferred)||void 0===w?void 0:w.isPending)&&(null===(S=this.redoDeferred)||void 0===S||S.reject(i)),(null===(x=this.clearDeferred)||void 0===x?void 0:x.isPending)&&this.clearDeferred.reject(i),(null===(b=this.waitForIdleDeferred)||void 0===b?void 0:b.isPending)&&this.waitForIdleDeferred.reject(i)}closeCallback(i){let s="";if(!this.currentErrorCode)switch(i.code){case 1e3:break;case 1001:s=n.GOING_AWAY;break;case 1002:s=n.PROTOCOL_ERROR;break;case 1003:s=n.UNSUPPORTED_DATA;break;case 1006:s=n.ABNORMAL_CLOSURE;break;case 1007:s=n.INVALID_FRAME_PAULOAD;break;case 1008:s=n.POLICY_VIOLATION;break;case 1009:s=n.MESSAGE_TOO_BIG;break;case 1011:s=n.INTERNAL_ERROR;break;case 1012:s=n.SERVICE_RESTART;break;case 1013:s=n.TRY_AGAIN;break;case 1014:s=n.BAD_GATEWAY;break;case 1015:s=n.TLS_HANDSHAKE;break;default:s=n.CANT_ESTABLISH}const a=new Error(s||i.reason);this.rejectDeferredPending(a),this.currentErrorCode||1e3===i.code||this.internalEvent.emitError(a)}manageHMACChallengeMessage(i){const n=i;n.hmacChallenge&&this.send({type:"hmac",hmac:computeHmac(n.hmacChallenge,this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)}),n.iinkSessionId&&(this.sessionId=n.iinkSessionId)}manageContentPackageDescriptionMessage(){this.reconnectionCount=0,this.send(Object.assign(Object.assign({},this.recognitionConfiguration),{type:"configuration"})),this.currentPartId?this.send({type:"openContentPart",id:this.currentPartId,mimeTypes:this.mimeTypes}):this.send({type:"newContentPart",contentType:this.recognitionConfiguration.type,mimeTypes:this.mimeTypes})}managePartChangeMessage(i){var n;const s=i;this.currentPartId=s.partId,null===(n=this.initialized)||void 0===n||n.resolve()}manageExportMessage(i){var n,s,a,l,d,c,h,u,p;const v=i;v.exports["application/vnd.myscript.jiix"]&&(v.exports["application/vnd.myscript.jiix"]=JSON.parse(v.exports["application/vnd.myscript.jiix"].toString())),null===(n=this.initialized)||void 0===n||n.resolve(),null===(s=this.addStrokeDeferred)||void 0===s||s.resolve(v.exports),null===(a=this.exportDeferred)||void 0===a||a.resolve(v.exports),null===(l=this.convertDeferred)||void 0===l||l.resolve(v.exports),null===(d=this.importDeferred)||void 0===d||d.resolve(v.exports),null===(c=this.undoDeferred)||void 0===c||c.resolve(v.exports),null===(h=this.redoDeferred)||void 0===h||h.resolve(v.exports),null===(u=this.clearDeferred)||void 0===u||u.resolve(v.exports),null===(p=this.importPointEventsDeferred)||void 0===p||p.resolve(v.exports),this.internalEvent.emitExported(v.exports)}manageWaitForIdle(){var i;return __awaiter(this,void 0,void 0,(function*(){this.internalEvent.emitIdle(!0),null===(i=this.waitForIdleDeferred)||void 0===i||i.resolve()}))}manageErrorMessage(i){var s,a;const l=i;this.currentErrorCode=(null===(s=l.data)||void 0===s?void 0:s.code)||l.code;let d=(null===(a=l.data)||void 0===a?void 0:a.message)||l.message||n.UNKNOW;switch(this.currentErrorCode){case"no.activity":d=n.NO_ACTIVITY;break;case"access.not.granted":d=n.WRONG_CREDENTIALS;break;case"session.too.old":d=n.TOO_OLD}const c=new Error(d);this.rejectDeferredPending(c),this.internalEvent.emitError(c)}manageContentChangeMessage(i){const n=i,s={canRedo:n.canRedo,canUndo:n.canUndo,empty:n.empty,stackIndex:n.undoStackIndex,possibleUndoCount:n.possibleUndoCount,stack:[]};this.internalEvent.emitContextChange(s)}manageSVGPatchMessage(i){var n;null===(n=this.resizeDeferred)||void 0===n||n.resolve();const s=i;this.internalEvent.emitSVGPatch(s)}messageCallback(i){var n;this.currentErrorCode=void 0;const s=JSON.parse(i.data);if("pong"!==s.type)switch(this.pingCount=0,s.type){case"ack":this.manageHMACChallengeMessage(s);break;case"contentPackageDescription":this.manageContentPackageDescriptionMessage();break;case"partChanged":this.managePartChangeMessage(s);break;case"newPart":null===(n=this.initialized)||void 0===n||n.resolve();break;case"contentChanged":this.manageContentChangeMessage(s);break;case"exported":this.manageExportMessage(s);break;case"svgPatch":this.manageSVGPatchMessage(s);break;case"error":this.manageErrorMessage(s);break;case"idle":this.manageWaitForIdle()}}init(i,s){var a,l;return __awaiter(this,void 0,void 0,(function*(){try{return this.destroy(),this.connected=new DeferredPromise,this.initialized=new DeferredPromise,this.viewSizeHeight=i,this.viewSizeWidth=s,this.pingCount=0,this.socket=new WebSocket(this.url),this.serverConfiguration.websocket.pingEnabled&&this.infinitePing(),this.socket.addEventListener("open",this.openCallback.bind(this)),this.socket.addEventListener("close",this.closeCallback.bind(this)),this.socket.addEventListener("message",this.messageCallback.bind(this)),this.initialized.promise}catch(i){const s=new Error(n.CANT_ESTABLISH);return this.internalEvent.emitError(s),null===(a=this.initialized)||void 0===a||a.reject(s),null===(l=this.initialized)||void 0===l?void 0:l.promise}}))}send(i){return __awaiter(this,void 0,void 0,(function*(){return this.connected?(yield this.connected.promise,this.socket.readyState===this.socket.OPEN?(this.socket.send(JSON.stringify(i)),Promise.resolve()):this.socket.readyState!=this.socket.CONNECTING&&this.serverConfiguration.websocket.autoReconnect?(this.reconnectionCount++,this.serverConfiguration.websocket.maxRetryCount>=this.reconnectionCount?(this.internalEvent.emitClearMessage(),yield this.init(this.viewSizeHeight,this.viewSizeWidth),this.setPenStyle(this.penStyle),this.setPenStyleClasses(this.penStyleClasses),this.setTheme(this.theme),this.send(i)):Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached."))):void 0):Promise.reject(new Error("Recognizer must be initilized"))}))}addStrokes(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.addStrokeDeferred=new DeferredPromise;const a=i.extractUnsentStrokes();i.updatePositionSent();const l=i.getClone();if(0===a.length)return this.addStrokeDeferred.resolve({}),l;yield this.send({type:"addStrokes",strokes:a.map(convertStrokeToJSON)});const d=yield null===(s=this.addStrokeDeferred)||void 0===s?void 0:s.promise;return l.updatePositionReceived(),l.mergeExport(d),l}))}setPenStyle(i){var n;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.penStyle=i;const s={type:"setPenStyle",style:ge.penStyleToCSS(i)};return this.send(s)}))}setPenStyleClasses(i){var n;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.penStyleClasses=i;const s={type:"setPenStyleClasses",styleClasses:i};return this.send(s)}))}setTheme(i){var n;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.theme=i;const s={type:"setTheme",theme:ge.themeToCSS(i)};return this.send(s)}))}export(i,n){var s,a;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.exportDeferred=new DeferredPromise;const l=i.getClone();let d=n||[];if(!d.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":d=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":d=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":d=["application/vnd.myscript.jiix"];break;case"TEXT":d=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}if(!d.length)return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${this.recognitionConfiguration.type} configuration`));const c={type:"export",partId:this.currentPartId,mimeTypes:d};yield this.send(c);const h=yield null===(a=this.exportDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeExport(h),l}))}import(i,n,s){var a,l;return __awaiter(this,void 0,void 0,(function*(){yield null===(a=this.initialized)||void 0===a?void 0:a.promise;const d=i.getClone(),c=this.serverConfiguration.websocket.fileChunkSize,h=Math.random().toString(10).substring(2,6);this.importDeferred=new DeferredPromise;const readBlob=i=>{const n=new FileReader;return new Promise(((s,a)=>{n.onloadend=i=>{var n;return s(null===(n=i.target)||void 0===n?void 0:n.result)},n.onerror=()=>a(),n.readAsText(i)}))},u={type:"importFile",importFileId:h,mimeType:s};yield this.send(u);for(let i=0;in.size};yield this.send(a)}const p=yield null===(l=this.importDeferred)||void 0===l?void 0:l.promise;return this.importDeferred=void 0,d.mergeExport(p),d}))}resize(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.resizeDeferred=new DeferredPromise;const a=i.getClone();this.viewSizeHeight=a.height,this.viewSizeWidth=a.width;const l={type:"changeViewSize",height:this.viewSizeHeight,width:this.viewSizeWidth};return yield this.send(l),yield null===(s=this.resizeDeferred)||void 0===s?void 0:s.promise,a}))}importPointEvents(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.importPointEventsDeferred=new DeferredPromise;const a={type:"pointerEvents",events:i.map(convertStrokeToJSON)};this.send(a);const l=yield null===(s=this.importPointEventsDeferred)||void 0===s?void 0:s.promise;return this.importPointEventsDeferred=void 0,l}))}convert(i,n){var s,a;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.convertDeferred=new DeferredPromise;const l=i.getClone(),d={type:"convert",conversionState:n};yield this.send(d);const c=yield null===(a=this.convertDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeConvert(c),l.mergeExport(c),l}))}waitForIdle(){var i,n;return __awaiter(this,void 0,void 0,(function*(){yield null===(i=this.initialized)||void 0===i?void 0:i.promise,this.waitForIdleDeferred=new DeferredPromise;return yield this.send({type:"waitForIdle"}),null===(n=this.waitForIdleDeferred)||void 0===n?void 0:n.promise}))}undo(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise;const a=i.getClone();this.undoDeferred=new DeferredPromise;yield this.send({type:"undo"});const l=yield null===(s=this.undoDeferred)||void 0===s?void 0:s.promise;return a.updatePositionReceived(),a.mergeExport(l),this.undoDeferred=void 0,a}))}redo(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise;const a=i.getClone();this.redoDeferred=new DeferredPromise;yield this.send({type:"redo"});const l=yield null===(s=this.redoDeferred)||void 0===s?void 0:s.promise;return a.updatePositionReceived(),a.mergeExport(l),this.redoDeferred=void 0,a}))}clear(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(n=this.initialized)||void 0===n?void 0:n.promise;const a=i.getClone();a.modificationDate=Date.now(),this.clearDeferred=new DeferredPromise;yield this.send({type:"clear"});const l=yield null===(s=this.clearDeferred)||void 0===s?void 0:s.promise;return a.updatePositionReceived(),a.mergeExport(l),this.clearDeferred=void 0,a}))}close(i,n){this.socket.readyState!==this.socket.OPEN&&this.socket.readyState!==this.socket.CONNECTING||(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.socket.close(i,n))}destroy(){this.connected=void 0,this.initialized=void 0,this.addStrokeDeferred=void 0,this.exportDeferred=void 0,this.convertDeferred=void 0,this.importDeferred=void 0,this.resizeDeferred=void 0,this.undoDeferred=void 0,this.redoDeferred=void 0,this.clearDeferred=void 0,this.socket&&(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.close(1e3,"Recognizer destroyed"))}}class SVGStroker{getArcPath(i,n){return[`M ${i.x},${i.y}`,`m ${-n},0`,`a ${n},${n} 0 1 0 ${2*n},0`,`a ${n},${n} 0 1 0 ${-2*n},0`].join(" ")}getLinePath(i,n,s){const a=computeLinksPoints(i,computeAxeAngle(i,n),s),l=computeLinksPoints(n,computeAxeAngle(i,n),s);return[`M ${a[0].x},${a[0].y}`,`L ${l[0].x},${l[0].y}`,`L ${l[1].x},${l[1].y}`,`L ${a[1].x},${a[1].y}`].join(" ")}getFinalPath(i,n,s){const a=computeAxeAngle(i,n),l=computeLinksPoints(n,a,s),d=[`M ${l[0].x},${l[0].y}`];for(let i=1;i<=6;i++){const l=a-i*(Math.PI/6);d.push(`L ${n.x-n.p*s*Math.sin(l)},${n.y+n.p*s*Math.cos(l)}`)}return d.join(" ")}getQuadraticPath(i,n,s,a){const l=computeLinksPoints(i,computeAxeAngle(i,s),a),d=computeLinksPoints(n,computeAxeAngle(s,n),a),c=computeLinksPoints(s,computeAxeAngle(i,n),a);return[`M ${l[0].x},${l[0].y}`,`Q ${c[0].x},${c[0].y} ${d[0].x},${d[0].y}`,`L ${d[1].x},${d[1].y}`,`Q ${c[1].x},${c[1].y} ${l[1].x},${l[1].y}`].join(" ")}buildSVGPath(i){const n=i.pointers.length,s=i.style.width,a=n-2,l=i.pointers[0],d=[];if(n<3)d.push(this.getArcPath(l,.6*s));else{d.push(this.getArcPath(l,s*l.p)),d.push(this.getLinePath(l,computeMiddlePoint(l,i.pointers[1]),s));for(let n=0;n{a.setAttribute(i.name,i.value)}));const l=this.buildSVGPath(n);a.setAttribute("d",`${l}Z`),i.appendChild(a)}}class WSSVGRenderer{constructor(i){je.add(this),this.config=i,this.stroker=new SVGStroker}init(i){i.style.fontSize="10px",this.context={parent:i}}updateLayer(i,n){switch(n.type){case"REPLACE_ALL":__classPrivateFieldGet(this,je,"m",Xe).call(this,i,n);break;case"REPLACE_ELEMENT":__classPrivateFieldGet(this,je,"m",Be).call(this,n);break;case"APPEND_CHILD":__classPrivateFieldGet(this,je,"m",Ue).call(this,i,n);break;case"REMOVE_ELEMENT":__classPrivateFieldGet(this,je,"m",Je).call(this,n);break;case"REMOVE_CHILD":__classPrivateFieldGet(this,je,"m",$e).call(this,n);break;case"INSERT_BEFORE":__classPrivateFieldGet(this,je,"m",Ve).call(this,n);break;case"SET_ATTRIBUTE":__classPrivateFieldGet(this,je,"m",Ye).call(this,n);break;case"REMOVE_ATTRIBUTE":__classPrivateFieldGet(this,je,"m",qe).call(this,n)}}updatesLayer(i,n){n.forEach((n=>this.updateLayer(i,n))),this.clearPendingStroke()}clearPendingStroke(){const i=this.context.parent.querySelector("#pendingStrokes");i&&(i.innerHTML="")}drawPendingStroke(i){if(i){const n=this.context.parent.querySelector("#pendingStrokes");if(n){const s=n.querySelector(`#${null==i?void 0:i.id}`);s&&s.remove(),__classPrivateFieldGet(this,je,"m",He).call(this,n,i)}}}resize(i){const n=this.context.parent.getBoundingClientRect(),s=this.context.parent.querySelectorAll("svg"),a=Math.max(n.width,i.width),l=Math.max(n.height,i.height);s.forEach((i=>{i.setAttribute("viewBox",`0 0 ${a}, ${l}`),i.setAttribute("width",`${a}px`),i.setAttribute("height",`${l}px`)}))}destroy(){this.context.parent&&this.context.parent.querySelectorAll("svg").forEach((i=>i.remove()))}}je=new WeakSet,He=function _WSSVGRenderer_drawStroke(i,n){let s;"eraser"===n.pointerType?(n.style.width=20,s="fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;"):s=`fill:${n.style.color};stroke:transparent;`,this.stroker.drawStroke(i,n,[{name:"style",value:s}])},Xe=function _WSSVGRenderer_replaceAll(i,n){const s=this.context.parent.querySelector(`svg[data-layer="${i}"]`);null==s||s.remove(),this.context.parent.insertAdjacentHTML("beforeend",n.svg);const a=this.context.parent.querySelector(`svg[data-layer="${i}"]`);if("MODEL"===i){const i=document.createElementNS("http://www.w3.org/2000/svg","g");i.id="pendingStrokes",a.appendChild(i)}},Be=function _WSSVGRenderer_replaceElement(i){const n=this.context.parent.querySelector(`#${i.id}`);if(n){const s=n.parentNode;null==n||n.remove(),null==s||s.insertAdjacentHTML("beforeend",i.svg)}},Ue=function _WSSVGRenderer_appendChild(i,n){const s=n.parentId?`#${n.parentId}`:`svg[data-layer="${i}"]`,a=this.context.parent.querySelector(s);null==a||a.insertAdjacentHTML("beforeend",n.svg)},$e=function _WSSVGRenderer_removeChild(i){var n;null===(n=this.context.parent.querySelector(`#${i.parentId} > *:nth-child(${i.index+1})`))||void 0===n||n.remove()},Je=function _WSSVGRenderer_removeElement(i){const n=this.context.parent.querySelector(`#${i.id}`);n&&(i.id.includes("s")||i.id.includes("MODEL")?n.remove():(n.setAttribute("class","removed-stroke"),setTimeout((()=>{null==n||n.remove()}),100)))},Ve=function _WSSVGRenderer_insertBefore(i){const n=this.context.parent.querySelector(`#${i.refId}`);null==n||n.insertAdjacentHTML("beforebegin",i.svg)},Ye=function _WSSVGRenderer_setAttribute(i){const n=i.id?`#${i.id}`:"svg",s=this.context.parent.querySelector(n);null==s||s.setAttribute(i.name,i.value)},qe=function _WSSVGRenderer_removeAttribute(i){const n=i.id?`#${i.id}`:"svg",s=this.context.parent.querySelector(n);null==s||s.removeAttribute(i.name)};class WSBehaviors{constructor(i){this.name="WSBehaviors",Ze.set(this,void 0),Ke.set(this,void 0),Qe.set(this,void 0),this.onSVGPatch=i=>{this.renderer.updatesLayer(i.layer,i.updates)},this.onContextChange=i=>{this.context.canRedo=i.canRedo,this.context.canUndo=i.canUndo,this.context.empty=i.empty,this.context.possibleUndoCount=i.possibleUndoCount,this.context.stackIndex=i.stackIndex},this.options=i,__classPrivateFieldSet(this,Ze,new Configuration(null==i?void 0:i.configuration),"f"),this.styleManager=new StyleManager(i.penStyle,i.theme),this.grabber=new PointerEventGrabber(__classPrivateFieldGet(this,Ze,"f").grabber),this.renderer=new WSSVGRenderer(__classPrivateFieldGet(this,Ze,"f").rendering),this.recognizer=new WSRecognizer(__classPrivateFieldGet(this,Ze,"f").server,__classPrivateFieldGet(this,Ze,"f").recognition),this.mode="writing",__classPrivateFieldSet(this,Ke,new Model,"f"),this.context={canRedo:!1,canUndo:!1,empty:!0,stackIndex:-1,possibleUndoCount:0,stack:[]}}get internalEvent(){return InternalEvent.getInstance()}get model(){return __classPrivateFieldGet(this,Ke,"f")}get configuration(){return __classPrivateFieldGet(this,Ze,"f")}get currentPenStyle(){return this.styleManager.currentPenStyle}get penStyle(){return this.styleManager.penStyle}setPenStyle(i){return this.styleManager.setPenStyle(i),this.recognizer.setPenStyle(this.styleManager.penStyle)}get penStyleClasses(){return this.styleManager.penStyleClasses}setPenStyleClasses(i){return this.styleManager.setPenStyleClasses(i),this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)}get theme(){return this.styleManager.theme}setTheme(i){return this.styleManager.setTheme(i),this.recognizer.setTheme(this.styleManager.theme)}init(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ke,"f").width=Math.max(i.clientWidth,__classPrivateFieldGet(this,Ze,"f").rendering.minWidth),__classPrivateFieldGet(this,Ke,"f").height=Math.max(i.clientHeight,__classPrivateFieldGet(this,Ze,"f").rendering.minHeight),this.context.stack.push(this.model.getClone()),this.context.stackIndex=0,this.renderer.init(i),this.grabber.attach(i),this.grabber.onPointerDown=this.onPointerDown.bind(this),this.grabber.onPointerMove=this.onPointerMove.bind(this),this.grabber.onPointerUp=this.onPointerUp.bind(this),this.internalEvent.addSVGPatchListener(this.onSVGPatch),this.internalEvent.addContextChangeListener(this.onContextChange),yield this.recognizer.init(__classPrivateFieldGet(this,Ke,"f").height,__classPrivateFieldGet(this,Ke,"f").width),yield this.setPenStyle(this.penStyle),yield this.setTheme(this.theme),yield this.setPenStyleClasses(this.penStyleClasses)}))}onPointerDown(i,n){var s;let{pointerType:a}=i;const l=Object.assign({},null===(s=this.theme)||void 0===s?void 0:s.ink,this.currentPenStyle);"erasing"===this.mode&&(a="eraser"),this.model.initCurrentStroke(n,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,n){this.model.appendToCurrentStroke(n),this.drawCurrentStroke()}onPointerUp(i,n){this.model.endCurrentStroke(n),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,Ke,"f"),i))).catch((i=>this.internalEvent.emitError(i)))}drawCurrentStroke(){const i=this.model.currentStroke;i&&this.renderer.drawPendingStroke(i)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){if(this.context.stack.push(this.model.getClone()),"DEMAND"!==__classPrivateFieldGet(this,Ze,"f").triggers.exportContent){const i=yield this.recognizer.addStrokes(this.model);this.model.mergeExport(i.exports)}return this.model}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){return this.recognizer.waitForIdle()}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){const n=yield this.recognizer.importPointEvents(i);return this.model.mergeExport(n),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){try{return"DEMAND"===__classPrivateFieldGet(this,Ze,"f").triggers.exportContent?this.recognizer.addStrokes(this.model):this.recognizer.export(this.model,i)}catch(i){return this.internalEvent.emitError(i),Promise.reject(i)}}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return this.context.stack.push(this.model.getClone()),__classPrivateFieldSet(this,Ke,yield this.recognizer.convert(this.model,i),"f"),this.model}))}import(i,n){return __awaiter(this,void 0,void 0,(function*(){return this.context.stack.push(this.model.getClone()),this.recognizer.import(this.model,i,n)}))}resize(i,n){return __awaiter(this,void 0,void 0,(function*(){const s=new DeferredPromise;this.model.height=i,this.model.width=n;const a=this.model.getClone();return this.renderer.resize(a),clearTimeout(__classPrivateFieldGet(this,Qe,"f")),__classPrivateFieldSet(this,Qe,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{const i=yield this.recognizer.resize(a);s.resolve(i)}catch(i){s.reject(i)}}))),__classPrivateFieldGet(this,Ze,"f").triggers.resizeTriggerDelay),"f"),__classPrivateFieldSet(this,Ke,yield s.promise,"f"),this.internalEvent.emitExported(this.model.exports),this.model}))}undo(){return __awaiter(this,void 0,void 0,(function*(){if(this.context.canUndo)return __classPrivateFieldSet(this,Ke,this.context.stack[this.context.stackIndex-1],"f"),this.recognizer.undo(__classPrivateFieldGet(this,Ke,"f"));throw new Error("Undo not allowed")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){if(this.context.canRedo)return __classPrivateFieldSet(this,Ke,this.context.stack[this.context.stackIndex+1],"f"),this.recognizer.redo(__classPrivateFieldGet(this,Ke,"f"));throw new Error("Redo not allowed")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.model.clear(),this.context.stack.push(this.model.getClone()),this.recognizer.clear(this.model)}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return this.grabber.detach(),this.renderer.destroy(),this.recognizer.close(1e3,l.CLOSE_RECOGNIZER),Promise.resolve()}))}}Ze=new WeakMap,Ke=new WeakMap,Qe=new WeakMap;var tt,it,nt,st,rt,ot,at,lt,dt,ct,ht,ut,pt,vt,mt,gt,ft,_t;!function styleInject(i,n){void 0===n&&(n={});var s=n.insertAt;if(i&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===s&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=i:l.appendChild(document.createTextNode(i))}}('.ms-editor {\n position: relative;\n z-index: 10;\n color: #1A9FFF;\n font-family: sans-serif;\n}\n\n.ms-editor.erasing {\n cursor: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=\') 10 10, auto;\n}\n\n.ms-editor canvas,\n.ms-editor svg {\n z-index: 20;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n\n.ms-editor canvas.ms-rendering-canvas {\n z-index: 9;\n pointer-events: none;\n background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px);\n background-size: 18px 18px;\n}\n\n.ms-editor .loader {\n z-index: 30;\n position: absolute;\n width: 120px;\n height: 120px;\n top: calc(50% - 60px);\n left: calc(50% - 60px);\n border: 16px solid #F5F6F7;\n border-radius: 50%;\n border-top-color: #1A9FFF;\n -webkit-animation: spin 2s linear infinite;\n animation: spin 2s linear infinite;\n}\n\n.ms-editor .message {\n z-index: 25;\n position: absolute;\n width: 300px;\n max-height: calc(25%);\n min-height: 200px;\n top: calc(50% - 100px);\n left: calc(50% - 150px);\n font-size: 16px;\n text-align: center;\n word-wrap: break-word;\n}\n\n.ms-editor .message.error-msg::before {\n content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo=");\n}\n\n.ms-editor .message.info-msg::before {\n content: "";\n background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");;\n background-size: 100% 100%;\n display: block;\n margin: auto;\n padding-bottom: 10px;\n height: 25px;\n width: 25px;\n}\n\n.ms-editor .smartguide {\n position: absolute;\n z-index: 40;\n font-size: 16px;\n height: 48px;\n line-height: 48px;\n}\n\n.ms-editor .smartguide.smartguide-in {\n visibility: visible !important;\n transition: opacity 0.5s;\n opacity: 1;\n}\n\n.ms-editor .smartguide.smartguide-out {\n transition: opacity 1s, visibility 1s;\n visibility: hidden !important;\n opacity: 0;\n}\n\n.ms-editor .smartguide .tag-icon {\n padding: 0 18px;\n border: 1px solid #959DA6;\n font-weight: bold;\n font-size: large;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n z-index: 31;\n height: 100%;\n line-height: 48px;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n}\n\n.ms-editor .smartguide .ellipsis {\n cursor: pointer;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 31;\n height: 48px;\n line-height: 38px;\n padding: 0 8px;\n font-weight: bold;\n font-size: x-large;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .ellipsis:active {\n background-color: #e0e0e0;\n}\n\n.ms-editor .smartguide .prompter-container {\n background-color: rgba(255, 255, 255, 0.9);\n height: 48px;\n line-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n text-align: left;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 30;\n color: #bfbfbf;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .prompter-container > div > span {\n cursor: pointer;\n display: inline-block;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text {\n margin-left: 12px;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .added-word {\n animation: 0.1s linear word-added,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .modified-word {\n animation: 0.1s linear word-modified,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .candidates {\n color: black;\n flex-direction: column;\n text-align: center;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n z-index: 100;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .candidates > span {\n cursor: pointer;\n padding: 2px 20px;\n}\n\n.ms-editor .smartguide .candidates > span:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .candidates > span:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .candidates .selected-word {\n font-weight: bold;\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .more-menu {\n display: flex;\n flex-direction: column;\n margin-right: 12px;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n z-index: 100;\n box-shadow: 2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n overflow: hidden;\n transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear;\n}\n.ms-editor .smartguide .more-menu.open {\n max-height: 500px;\n visibility: visible;\n opacity: 1;\n}\n.ms-editor .smartguide .more-menu.close {\n max-height: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button {\n color: black;\n font-size: 16px;\n cursor: pointer;\n box-sizing: border-box;\n background: transparent;\n border: none;\n padding: 0 24px;\n margin: 0;\n height: 40px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .ps__rail-x {\n top: 32px !important;\n}\n\n.ms-editor #stroke-panel {\n position: fixed;\n bottom: 10px;\n left: 10px;\n right: 10px;\n background-color: white;\n border: solid black 2px;\n padding: 5px;\n word-wrap: break-word;\n overflow: auto;\n cursor: copy;\n max-height: 100px;\n z-index: 999;\n}\n\n/** Stroke **/\n\n.ms-editor .removed-stroke {\n opacity: 0;\n transition: opacity 0.1s ease-in-out;\n}\n\n.ms-editor .added-stroke {\n animation: 0.2s opacity-appear;\n}\n\n@keyframes color-input {\n 0% {\n color: black;\n }\n 100% {\n color: #bfbfbf;\n }\n}\n\n@keyframes word-added {\n 0% {\n transform: translate(5px, 0);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes word-modified {\n 0% {\n transform: translate(0, 5px);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes opacity-appear {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity : 1;\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n');it=new WeakMap,nt=new WeakMap,st=new WeakMap,rt=new WeakMap,ot=new WeakMap,mt=new WeakMap,gt=new WeakMap,tt=new WeakSet,at=function _Editor_instantiateBehaviors(i){var n;if(!(null==i?void 0:i.configuration))throw new Error("Configuration required");let s;__classPrivateFieldGet(this,st,"f")&&__classPrivateFieldGet(this,st,"f").destroy(),s="REST"===(null===(n=i.configuration.server)||void 0===n?void 0:n.protocol)?new RestBehaviors(i):new WSBehaviors(i),__classPrivateFieldSet(this,st,Object.assign(s,i.behaviors),"f")},lt=function _Editor_initializeBehaviors(){return __classPrivateFieldSet(this,ot,new DeferredPromise,"f"),__classPrivateFieldGet(this,it,"f").style.display="initial",__classPrivateFieldGet(this,tt,"m",ct).call(this),this.behaviors.init(this.wrapperHTML).then((()=>__awaiter(this,void 0,void 0,(function*(){this.wrapperHTML.editor=this,__classPrivateFieldGet(this,ot,"f").resolve(),this.events.emitLoaded()})))).catch((i=>{__classPrivateFieldGet(this,ot,"f").reject(i),__classPrivateFieldGet(this,tt,"m",ht).call(this,i)})).finally((()=>(__classPrivateFieldGet(this,it,"f").style.display="none",__classPrivateFieldGet(this,ot,"f").promise)))},dt=function _Editor_initializeSmartGuide(){var i;if(null===(i=__classPrivateFieldGet(this,rt,"f"))||void 0===i||i.destroy(),this.configuration.rendering.smartGuide.enable){let i;switch(__classPrivateFieldSet(this,rt,new SmartGuide,"f"),this.configuration.recognition.type){case"TEXT":i=this.configuration.recognition.text.margin;break;case"MATH":i=this.configuration.recognition.math.margin;break;default:i={top:20,left:10,right:10,bottom:10}}__classPrivateFieldGet(this,rt,"f").init(this.wrapperHTML,i,this.configuration.rendering)}},ct=function _Editor_cleanMessage(){__classPrivateFieldGet(this,nt,"f").style.display="none",__classPrivateFieldGet(this,nt,"f").innerHTML=""},ht=function _Editor_showError(i){if(__classPrivateFieldGet(this,nt,"f").style.display="initial",__classPrivateFieldGet(this,nt,"f").classList.add("error-msg"),__classPrivateFieldGet(this,nt,"f").classList.remove("info-msg"),__classPrivateFieldGet(this,nt,"f").innerText=i.message,this.debug){const n=document.createElement("p");n.innerHTML=i.name,__classPrivateFieldGet(this,nt,"f").prepend(n);const s=document.createElement("p");s.style.width="50vw",s.style.marginLeft="calc(-25vw + 100px)",s.innerHTML=i.stack||"",__classPrivateFieldGet(this,nt,"f").appendChild(s)}},ut=function _Editor_showNotif(i){__classPrivateFieldGet(this,nt,"f").style.display="initial",__classPrivateFieldGet(this,nt,"f").classList.add("info-msg"),__classPrivateFieldGet(this,nt,"f").classList.remove("error-msg"),__classPrivateFieldGet(this,nt,"f").innerText=i.message,setTimeout((()=>{__classPrivateFieldGet(this,tt,"m",ct).call(this)}),i.timeout||2500)},pt=function _Editor_showStrokesIfDebug(){if(this.debug){let i=document.getElementById("stroke-panel");const n=JSON.stringify(this.model.rawStrokes.map((i=>({pointerType:i.pointerType,pointerId:i.pointerId,pointers:i.pointers}))));i||(i=document.createElement("div"),i.id="stroke-panel",i.addEventListener("click",(()=>{navigator.clipboard.writeText(null==i?void 0:i.innerText),__classPrivateFieldGet(this,tt,"m",ut).call(this,{message:"strokes copied to clipboard!",timeout:1500})})),this.wrapperHTML.appendChild(i)),i.innerText=n}},vt=function _Editor_addListeners(){InternalEvent.getInstance().addConvertListener(this.convert.bind(this)),InternalEvent.getInstance().addClearListener(this.clear.bind(this)),InternalEvent.getInstance().addErrorListener(__classPrivateFieldGet(this,tt,"m",ht).bind(this)),InternalEvent.getInstance().addImportJIIXListener(__classPrivateFieldGet(this,tt,"m",_t).bind(this)),InternalEvent.getInstance().addExportedListener(__classPrivateFieldGet(this,tt,"m",ft).bind(this)),InternalEvent.getInstance().addNotifListener(__classPrivateFieldGet(this,tt,"m",ut).bind(this)),InternalEvent.getInstance().addClearMessageListener(__classPrivateFieldGet(this,tt,"m",ct).bind(this)),InternalEvent.getInstance().addContextChangeListener(__classPrivateFieldGet(this,mt,"f").bind(this)),InternalEvent.getInstance().addIdleListener(__classPrivateFieldGet(this,gt,"f").bind(this))},ft=function _Editor_onExport(i){var n;if(this.model.mergeExport(i),this.configuration.rendering.smartGuide.enable&&i&&i["application/vnd.myscript.jiix"]){const s=i["application/vnd.myscript.jiix"];null===(n=__classPrivateFieldGet(this,rt,"f"))||void 0===n||n.update(s)}__classPrivateFieldGet(this,tt,"m",pt).call(this),this.events.emitExported(i)},_t=function _Editor_onImportJIIX(i){this.import(new Blob([JSON.stringify(i)],{type:d.JIIX}),d.JIIX)},i.CanvasRenderer=CanvasRenderer,i.CanvasStroker=CanvasStroker,i.Configuration=Configuration,i.Constants=oe,i.DefaultConfiguration=De,i.DefaultEventsConfiguration=Le,i.DefaultGrabberConfiguration=Me,i.DefaultPenStyle=we,i.DefaultRecognitionConfiguration=Fe,i.DefaultRenderingConfiguration=Ge,i.DefaultServerConfiguration=ke,i.DefaultTheme=Se,i.DefaultTriggerConfiguration=Te,i.DefaultUndoRedoConfiguration=Ie,i.DeferredPromise=DeferredPromise,i.Editor=class Editor{constructor(i,n,s="ms-editor"){tt.add(this),it.set(this,void 0),nt.set(this,void 0),st.set(this,void 0),rt.set(this,void 0),ot.set(this,void 0),this.debug=!1,mt.set(this,(i=>{this.events.emitChanged(i)})),gt.set(this,(i=>{this.events.emitIdle(i)})),__classPrivateFieldSet(this,ot,new DeferredPromise,"f"),this.wrapperHTML=i,this.wrapperHTML.classList.add(s),this.events.setElement(this.wrapperHTML),__classPrivateFieldSet(this,it,document.createElement("div"),"f"),__classPrivateFieldGet(this,it,"f").classList.add("loader"),__classPrivateFieldGet(this,it,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,it,"f")),__classPrivateFieldSet(this,nt,document.createElement("div"),"f"),__classPrivateFieldGet(this,nt,"f").classList.add("message"),__classPrivateFieldGet(this,nt,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldGet(this,tt,"m",at).call(this,n),__classPrivateFieldGet(this,tt,"m",vt).call(this)}get initializationPromise(){return __classPrivateFieldGet(this,ot,"f").promise}get model(){return this.behaviors.model}get behaviors(){return __classPrivateFieldGet(this,st,"f")}get configuration(){return this.behaviors.configuration}set configuration(i){__classPrivateFieldGet(this,tt,"m",at).call(this,{configuration:i}),this.initialize()}get mode(){return this.behaviors.mode}set mode(i){if(this.behaviors.mode=i,"erasing"===this.behaviors.mode)this.wrapperHTML.classList.add("erasing"),this.wrapperHTML.classList.remove("selecting");else document.body.style.cursor="initial",this.wrapperHTML.classList.remove("erasing"),this.wrapperHTML.classList.remove("selecting")}get events(){return PublicEvent.getInstance()}get context(){return this.behaviors.context}get grabber(){return this.behaviors.grabber}get currentPenStyle(){return this.behaviors.currentPenStyle}get penStyle(){return this.behaviors.penStyle}set penStyle(i){this.behaviors.setPenStyle(i)}get theme(){return this.behaviors.theme}set theme(i){this.behaviors.setTheme(i)}get penStyleClasses(){return this.behaviors.penStyleClasses}set penStyleClasses(i){this.behaviors.setPenStyleClasses(i)}initialize(){return __awaiter(this,void 0,void 0,(function*(){yield __classPrivateFieldGet(this,tt,"m",lt).call(this),__classPrivateFieldGet(this,tt,"m",dt).call(this)}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){if(this.behaviors.waitForIdle)return this.behaviors.waitForIdle()}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,ot,"f").promise,yield this.behaviors.undo(),__classPrivateFieldGet(this,tt,"m",pt).call(this),this.model}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,ot,"f").promise,yield this.behaviors.redo(),__classPrivateFieldGet(this,tt,"m",pt).call(this),this.model}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,ot,"f").promise,yield this.behaviors.clear(),this.events.emitCleared(this.model),__classPrivateFieldGet(this,tt,"m",pt).call(this),this.model}))}resize(){var i;return __awaiter(this,void 0,void 0,(function*(){yield __classPrivateFieldGet(this,ot,"f").promise,this.configuration.rendering.smartGuide.enable&&(null===(i=__classPrivateFieldGet(this,rt,"f"))||void 0===i||i.resize());const n=Math.max(this.wrapperHTML.clientHeight,this.configuration.rendering.minHeight),s=Math.max(this.wrapperHTML.clientWidth,this.configuration.rendering.minWidth);return yield this.behaviors.resize(n,s),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,ot,"f").promise,yield this.behaviors.export(i),this.model}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,ot,"f").promise,yield this.behaviors.convert(null==i?void 0:i.conversionState,null==i?void 0:i.mimeTypes),this.events.emitConverted(this.model.converts),this.model}))}import(i,n){return __awaiter(this,void 0,void 0,(function*(){if(yield __classPrivateFieldGet(this,ot,"f").promise,this.behaviors.import){let s;return s=i instanceof Blob?i:"string"==typeof i?new Blob([i]):new Blob([JSON.stringify(i)]),yield this.behaviors.import(s,n),this.events.emitImported(this.model.exports),this.model}return Promise.reject("Import impossible, behaviors has no import function")}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,ot,"f").promise,this.behaviors.importPointEvents?(yield this.behaviors.importPointEvents(i),this.events.emitImported(this.model.exports),this.model):Promise.reject("Import impossible, behaviors has no importPointEvents function")}))}},i.InternalEvent=InternalEvent,i.Model=Model,i.PointerEventGrabber=PointerEventGrabber,i.PublicEvent=PublicEvent,i.RestBehaviors=RestBehaviors,i.RestRecognizer=RestRecognizer,i.SVGStroker=SVGStroker,i.SmartGuide=SmartGuide,i.Stroke=Stroke,i.StyleHelper=ge,i.StyleManager=StyleManager,i.UndoRedoContext=UndoRedoContext,i.UndoRedoManager=UndoRedoManager,i.WSBehaviors=WSBehaviors,i.WSRecognizer=WSRecognizer,i.WSSVGRenderer=WSSVGRenderer,i.canvasRendererShape=le,i.canvasRendererStroke=de,i.canvasRendererText=he,i.computeHmac=computeHmac,i.convertStrokeToJSON=convertStrokeToJSON,i.geometric=et,i.getAvailableFontList=function getAvailableFontList(i){var n,s,a;return __awaiter(this,void 0,void 0,(function*(){if(!(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.scheme)&&!(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.host))return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!");if(!(null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.lang))return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!");const l=i.server,d=yield fetch(`${l.scheme}://${l.host}/api/v4.0/iink/font/google/language/`+i.recognition.lang),{result:c}=yield d.json();return c.sort()}))},i.getAvailableLanguageList=function getAvailableLanguageList(i){var n,s;return __awaiter(this,void 0,void 0,(function*(){if((null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.scheme)&&(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.host)){const n=i.server;return(yield fetch(`${n.scheme}://${n.host}/api/v4.0/iink/availableLanguageList`)).json()}return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!")}))},i.quadradicsUtils=ue,i.version=Pe,Object.defineProperty(i,"__esModule",{value:!0})})); +//# sourceMappingURL=iink.min.js.map diff --git a/dist/iink.min.js.map b/dist/iink.min.js.map new file mode 100644 index 00000000..945280be --- /dev/null +++ b/dist/iink.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.min.js","sources":["../node_modules/tslib/tslib.es6.mjs","../src/Constants.ts","../src/event/PublicEvent.ts","../src/event/InternalEvent.ts","../src/smartguide/SmartGuide.ts","../src/utils/DeferredPromise.ts","../src/grabber/PointerEventGrabber.ts","../src/renderer/canvas/CanvasRendererShapeSymbol.ts","../src/renderer/canvas/CanvasRendererStrokeSymbol.ts","../src/renderer/canvas/CanvasRendererTextSymbol.ts","../src/renderer/QuadraticUtils.ts","../src/renderer/canvas/CanvasStroker.ts","../src/renderer/canvas/CanvasRenderer.ts","../node_modules/json-css/lib/jsoncss.min.js","../src/style/StyleHelper.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/x64-core.js","../node_modules/crypto-js/sha512.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/hmac-sha512.js","../src/recognizer/CryptoHelper.ts","../src/utils/version.ts","../src/model/Stroke.ts","../src/recognizer/RestRecognizer.ts","../src/undo-redo/UndoRedoContext.ts","../src/undo-redo/UndoRedoManager.ts","../src/utils/MergeHelper.ts","../src/style/DefaultPenStyle.ts","../src/style/DefaultTheme.ts","../src/style/StyleManager.ts","../src/configuration/DefaultConfiguration.ts","../src/configuration/Configuration.ts","../src/utils/geometric.ts","../src/model/Model.ts","../src/behaviors/RestBehaviors.ts","../src/recognizer/WSRecognizer.ts","../src/renderer/svg/SVGStroker.ts","../src/renderer/svg/WSSVGRenderer.ts","../src/behaviors/WSBehaviors.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Editor.ts","../src/utils/font.ts","../src/utils/language.ts"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n};\n","/**\n * @group Error\n * @remarks List all errors generated by the backend with their descriptions\n */\nexport const Error = {\n NO_ACTIVITY: \"Session closed due to no activity.\",\n WRONG_CREDENTIALS: \"Application credentials are invalid. Please check or regenerate your application key and hmackey.\",\n TOO_OLD: \"Session is too old. Max Session Duration Reached.\",\n UNKNOW: \"An unknown error has occurred.\",\n ABNORMAL_CLOSURE: \"MyScript recognition server is not reachable.\",\n CANT_ESTABLISH: \"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.\",\n GOING_AWAY: \"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.\",\n PROTOCOL_ERROR: \"MyScript recognition server terminated the connection due to a protocol error.\",\n UNSUPPORTED_DATA: \"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)\",\n INVALID_FRAME_PAULOAD: \"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).\",\n POLICY_VIOLATION: \"MyScript recognition server terminated the connection because it received a message that violates its policy.\",\n MESSAGE_TOO_BIG: \"MyScript recognition server terminated the connection because a data frame was received that is too large.\",\n INTERNAL_ERROR: \"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.\",\n SERVICE_RESTART: \"MyScript recognition server terminated the connection because it is restarting.\",\n TRY_AGAIN: \"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.\",\n BAD_GATEWAY: \"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.\",\n TLS_HANDSHAKE: \"MyScript recognition server connection was closed due to a failure to perform a TLS handshake\"\n} as const\n\n/**\n * @event\n * @remarks Lists all events that can be listened to on the editor or DOM element\n */\nexport const EventType = {\n /**\n * @event\n * event emitted when history has changed i.e. the context of undo-redo\n */\n CHANGED: \"changed\",\n /**\n * @event\n * event emitted when clearing is complete\n */\n CLEARED: \"cleared\",\n /**\n * @event\n * event emitted after the conversion is complete\n */\n CONVERTED: \"converted\",\n /**\n * @event\n * event emitted when the editor encounters an error\n */\n ERROR: \"error\",\n /**\n * @event\n * event emitted on click on pointer events\n */\n POINTEREVENTS: \"pointer_events\",\n /**\n * @event\n * event emitted after the end of the export\n */\n EXPORTED: \"exported\",\n /**\n * @event\n * event emitted after the end of the import\n */\n IMPORTED: \"imported\",\n /**\n * @event\n * event emitted when the server is idle after a job\n */\n IDLE: \"idle\",\n /**\n * @event\n * event emitted after full editor initialization\n */\n LOADED: \"loaded\",\n} as const\n\n/**\n * @internal\n */\nexport const InternalEventType = {\n SVG_PATCH: \"internal_svg_patch\",\n EXPORTED: \"internal_exported\",\n CLEAR_MESSAGE: \"internal_clear_message\",\n ERROR: \"internal_error\",\n NOTIF: \"internal_notif\",\n IMPORT_JIIX: \"internal_import_jiix\",\n CONVERT: \"internal_convert\",\n CLEAR: \"internal_clear\",\n CONTEXT_CHANGE: \"internal_context_change\",\n IDLE: \"internal_idle\",\n WS_CLOSED: \"internal_websocket_closed\",\n} as const\n\n/**\n * @internal\n */\nexport const WSMessage = {\n CLOSE_RECOGNIZER: \"CLOSE_RECOGNIZER\"\n}\n\n/**\n * @group Export\n * @remarks List all supported MIME types for export.\n * @remarks Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition}\n */\nexport const Exports = {\n JIIX: \"application/vnd.myscript.jiix\",\n TEXT: \"text/plain\",\n LATEX: \"application/x-latex\",\n MATHML: \"application/mathml+xml\",\n SVG: \"image/svg+xml\",\n OFFICE_DOCUMENT: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n} as const\n\n/**\n * @group Editor\n * @remarks List the possibilities of interactions\n */\nexport const enum ModeInteraction\n{\n Writing = \"writing\",\n Erasing = \"erasing\",\n // Selecting = \"selecting\"\n}\n\n/**\n * @group Constants\n */\nexport default {\n Error,\n EventType,\n InternalEventType,\n Exports,\n WSMessage,\n} as const\n","import { IModel, TExport } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { EventType } from \"../Constants\"\n\nexport class PublicEvent extends EventTarget\n{\n static #instance: PublicEvent\n #element?: HTMLElement\n\n private constructor()\n {\n super()\n }\n\n public static getInstance(): PublicEvent\n {\n if (!PublicEvent.#instance) {\n PublicEvent.#instance = new PublicEvent()\n }\n\n return PublicEvent.#instance\n }\n\n setElement(el: HTMLElement)\n {\n this.#element = el\n }\n\n #emit(type: string, data?: unknown): void\n {\n const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))\n this.dispatchEvent(evt)\n this.#element?.dispatchEvent(evt)\n }\n\n emitLoaded(): void\n {\n this.#emit(EventType.LOADED)\n }\n\n emitExported(exports: TExport): void\n {\n this.#emit(EventType.EXPORTED, exports)\n }\n\n emitChanged(undoRedoContext: TUndoRedoContext): void\n {\n this.#emit(EventType.CHANGED, {\n ...undoRedoContext,\n canClear: !undoRedoContext.empty\n })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#emit(EventType.IDLE, idle)\n }\n\n emitCleared(model?: IModel): void\n {\n this.#emit(EventType.CLEARED, model)\n }\n\n emitConverted(exports: TExport): void\n {\n this.#emit(EventType.CONVERTED, exports)\n }\n\n emitImported(exports: TExport): void\n {\n this.#emit(EventType.IMPORTED, exports)\n }\n}\n","import { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { InternalEventType } from \"../Constants\"\n\nexport class InternalEvent extends EventTarget\n{\n static #instance: InternalEvent\n #abortController: AbortController\n\n private constructor()\n {\n super()\n this.#abortController = new AbortController()\n }\n\n public static getInstance(): InternalEvent\n {\n if (!InternalEvent.#instance) {\n InternalEvent.#instance = new InternalEvent()\n }\n\n return InternalEvent.#instance\n }\n\n removeAllListeners(): void\n {\n this.#abortController.abort()\n }\n\n #emit(type: string, data?: unknown): void\n {\n this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)))\n }\n\n emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void\n {\n this.#emit(InternalEventType.SVG_PATCH, patchChange)\n }\n addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void\n {\n this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal })\n }\n\n emitExported(exports: TExport): void\n {\n this.#emit(InternalEventType.EXPORTED, exports)\n }\n addExportedListener(callback: (exports: TExport) => void): void\n {\n this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal })\n }\n\n emitClearMessage(): void\n {\n this.#emit(InternalEventType.CLEAR_MESSAGE)\n }\n addClearMessageListener(callback: () => void): void\n {\n this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitError(err: Error): void\n {\n this.#emit(InternalEventType.ERROR, err)\n }\n addErrorListener(callback: (err: Error) => void): void\n {\n this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal })\n }\n\n emitWSClosed(): void\n {\n this.#emit(InternalEventType.WS_CLOSED)\n }\n addWSClosedListener(callback: () => void): void\n {\n this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitNotif(notif: { message: string, timeout?: number }): void\n {\n this.#emit(InternalEventType.NOTIF, notif)\n }\n addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void\n {\n this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal })\n }\n\n emitImportJIIX(jiix: TJIIXExport): void\n {\n this.#emit(InternalEventType.IMPORT_JIIX, jiix)\n }\n addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void\n {\n this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal })\n }\n\n emitConvert(conversionState: TConverstionState = \"DIGITAL_EDIT\"): void\n {\n this.#emit(InternalEventType.CONVERT, conversionState)\n }\n addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void\n {\n this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal })\n }\n\n emitClear(): void\n {\n this.#emit(InternalEventType.CLEAR)\n }\n addClearListener(callback: () => void): void\n {\n this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitContextChange(context: TUndoRedoContext): void\n {\n this.#emit(InternalEventType.CONTEXT_CHANGE, context)\n }\n addContextChangeListener(callback: (context: TUndoRedoContext) => void): void\n {\n this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#emit(InternalEventType.IDLE, idle)\n }\n addIdleListener(callback: (idle: boolean) => void): void\n {\n this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal })\n }\n}\n","import { TMarginConfiguration } from \"../@types/configuration/recognition/MarginConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TJIIXExport, TWordExport } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\n\nexport class SmartGuide\n{\n uuid: string\n #smartGuideElement!: HTMLDivElement\n #prompterContainerElement!: HTMLDivElement\n #prompterTextElement!: HTMLDivElement\n #ellipsisElement!: HTMLDivElement\n #tagElement!: HTMLDivElement\n #candidatesElement!: HTMLDivElement\n #menuElement!: HTMLDivElement\n #convertElement!: HTMLButtonElement\n #copyElement!: HTMLButtonElement\n #deleteElement!: HTMLButtonElement\n #fadeOutTimout?: ReturnType\n #isMenuOpen!: boolean\n margin: TMarginConfiguration\n renderingConfiguration!: TRenderingConfiguration\n jiix?: TJIIXExport\n lastWord?: TWordExport\n wordToChange?: TWordExport\n\n constructor()\n {\n this.uuid = Math.random().toString(10).substring(2, 12)\n this.margin = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n this.#createWrapperElement()\n this.#createPrompterContainerElement()\n this.#createPrompterTextElement()\n this.#createEllipsisElement()\n this.#createTagElement()\n this.#createCandidatesElement()\n this.#createMoreMenuElement()\n this.#createConvertElement()\n this.#createCopyElement()\n this.#createDeleteElement()\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n #createWrapperElement(): void\n {\n this.#smartGuideElement = document.createElement(\"div\")\n this.#smartGuideElement.id = `smartguide-${ this.uuid }`\n this.#smartGuideElement.classList.add(\"smartguide\")\n }\n\n #createPrompterContainerElement(): void\n {\n this.#prompterContainerElement = document.createElement(\"div\")\n this.#prompterContainerElement.id = `prompter-container-${ this.uuid }`\n this.#prompterContainerElement.classList.add(\"prompter-container\")\n // this.#prompterContainerElement.appendChild(textElement)\n }\n\n #createPrompterTextElement(): void\n {\n this.#prompterTextElement = document.createElement(\"div\")\n this.#prompterTextElement.id = `prompter-text-${ this.uuid }`\n this.#prompterTextElement.classList.add(\"prompter-text\")\n this.#prompterTextElement.setAttribute(\"touch-action\", \"none\")\n }\n\n #createEllipsisElement(): void\n {\n this.#ellipsisElement = document.createElement(\"div\")\n this.#ellipsisElement.id = `ellipsis-${ this.uuid }`\n this.#ellipsisElement.classList.add(\"ellipsis\")\n this.#ellipsisElement.innerHTML = \"...\"\n }\n\n #createTagElement(): void\n {\n this.#tagElement = document.createElement(\"div\")\n this.#tagElement.id = `tag-icon-${ this.uuid }`\n this.#tagElement.classList.add(\"tag-icon\")\n this.#tagElement.innerHTML = \"¶\"\n }\n\n #createCandidatesElement(): void\n {\n this.#candidatesElement = document.createElement(\"div\")\n this.#candidatesElement.id = `candidates-${ this.uuid }`\n this.#candidatesElement.classList.add(\"candidates\")\n }\n\n #createMoreMenuElement(): void\n {\n this.#menuElement = document.createElement(\"div\")\n this.#menuElement.id = `more-menu-${ this.uuid }`\n this.#menuElement.classList.add(\"more-menu\")\n }\n\n #createConvertElement(): void\n {\n this.#convertElement = document.createElement(\"button\")\n this.#convertElement.id = `convert-${ this.uuid }`\n this.#convertElement.classList.add(\"options-label-button\")\n this.#convertElement.innerHTML = \"Convert\"\n }\n\n #createCopyElement(): void\n {\n this.#copyElement = document.createElement(\"button\")\n this.#copyElement.id = `copy-${ this.uuid }`\n this.#copyElement.classList.add(\"options-label-button\")\n this.#copyElement.innerHTML = \"Copy\"\n }\n\n #createDeleteElement(): void\n {\n this.#deleteElement = document.createElement(\"button\")\n this.#deleteElement.id = `delete-${ this.uuid }`\n this.#deleteElement.classList.add(\"options-label-button\")\n this.#deleteElement.innerHTML = \"Delete\"\n }\n\n init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void\n {\n domElement.appendChild(this.#smartGuideElement)\n this.#smartGuideElement.appendChild(this.#tagElement)\n\n this.#prompterContainerElement.appendChild(this.#prompterTextElement)\n this.#smartGuideElement.appendChild(this.#prompterContainerElement)\n\n this.#smartGuideElement.appendChild(this.#ellipsisElement)\n\n this.#menuElement.appendChild(this.#convertElement)\n this.#menuElement.appendChild(this.#copyElement)\n this.#menuElement.appendChild(this.#deleteElement)\n this.#smartGuideElement.appendChild(this.#menuElement)\n this.#menuElement.classList.add(\"close\")\n this.#isMenuOpen = false\n\n this.#smartGuideElement.appendChild(this.#candidatesElement)\n this.#candidatesElement.style.display = \"none\"\n this.margin = margin\n this.renderingConfiguration = renderingConfiguration\n this.#addListeners()\n\n this.#show()\n if (this.renderingConfiguration.smartGuide.fadeOut.enable) {\n this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration)\n }\n\n this.resize()\n }\n\n #initFadeOutObserver(duration = 3000): void\n {\n const observer = new MutationObserver(() =>\n {\n clearTimeout(this.#fadeOutTimout)\n if (\n !this.#smartGuideElement.classList.contains(\"smartguide-out\") &&\n this.#candidatesElement.style.display === \"none\" &&\n !this.#isMenuOpen\n ) {\n this.#fadeOutTimout = setTimeout(() =>\n {\n this.#hide()\n }, duration)\n }\n })\n observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true })\n }\n\n #show(): void\n {\n this.#smartGuideElement.classList.remove(\"smartguide-out\")\n this.#smartGuideElement.classList.add(\"smartguide-in\")\n }\n #hide(): void\n {\n this.#smartGuideElement.classList.add(\"smartguide-out\")\n this.#smartGuideElement.classList.remove(\"smartguide-in\")\n }\n\n #showCandidates = (target: HTMLElement) =>\n {\n const wordId = parseInt(target.id.replace(\"word-\", \"\").replace(this.uuid, \"\"))\n const words = this.jiix?.words as TWordExport[]\n this.wordToChange = words[wordId]\n if (this.wordToChange) {\n this.wordToChange.id = wordId.toString()\n this.#candidatesElement.innerHTML = \"\"\n if (this.wordToChange?.candidates) {\n this.#candidatesElement.style.display = \"flex\"\n this.wordToChange.candidates.forEach((word, index) =>\n {\n if (this.wordToChange?.label === word) {\n this.#candidatesElement.innerHTML += `${ word }`\n } else {\n this.#candidatesElement.innerHTML += `${ word }`\n }\n })\n const top = 48\n const left = target.getBoundingClientRect().left - 60\n this.#candidatesElement.style.top = `${ top }px`\n this.#candidatesElement.style.left = `${ left }px`\n\n const parent = target.parentNode?.parentNode?.parentNode\n if (parent) {\n parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode)\n }\n }\n }\n }\n #hideCandidates(): void\n {\n this.#candidatesElement.style.display = \"none\"\n }\n\n #openMenu(): void\n {\n this.#menuElement.classList.add(\"open\")\n this.#menuElement.classList.remove(\"close\")\n this.#isMenuOpen = true\n }\n #closeMenu(): void\n {\n this.#menuElement.classList.add(\"close\")\n this.#menuElement.classList.remove(\"open\")\n this.#isMenuOpen = false\n }\n\n #onClickEllipsis = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.#isMenuOpen ? this.#closeMenu() : this.#openMenu()\n this.#hideCandidates()\n }\n\n #onClickConvert = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitConvert()\n this.#closeMenu()\n }\n\n #onClickCopy = async (evt: Event): Promise =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n try {\n this.#closeMenu()\n let message = \"Nothing to copy\"\n if (this.#prompterTextElement.innerText) {\n message = `\"${ this.#prompterTextElement.innerText }\" copied to clipboard`\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n this.internalEvent.emitNotif({ message, timeout: 1500 })\n } catch (err) {\n this.internalEvent.emitError(err as Error)\n }\n }\n\n #onClickDelete = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitClear()\n this.#closeMenu()\n }\n\n #onClickCandidate = (evt: Event) =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n const target = evt.target as HTMLElement\n const candidate = target.innerText\n if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) {\n this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate\n this.internalEvent.emitImportJIIX(this.jiix)\n }\n this.#candidatesElement.style.display = \"none\"\n }\n\n #onClickPrompter = (evt: Event): void =>\n {\n evt.preventDefault()\n evt.stopPropagation()\n this.#closeMenu()\n const target = evt.target as HTMLElement\n if (target.id !== this.#prompterTextElement.id) {\n this.#showCandidates(target)\n } else {\n this.#hideCandidates()\n }\n\n }\n\n #onClickOutSide = () =>\n {\n this.#hideCandidates()\n this.#closeMenu()\n }\n\n #addListeners(): void\n {\n this.#ellipsisElement.addEventListener(\"pointerdown\", evt => this.#onClickEllipsis(evt))\n this.#convertElement.addEventListener(\"pointerdown\", evt => this.#onClickConvert(evt))\n this.#copyElement.addEventListener(\"pointerdown\", evt => this.#onClickCopy(evt))\n this.#deleteElement.addEventListener(\"pointerdown\", evt => this.#onClickDelete(evt))\n this.#prompterTextElement.addEventListener(\"pointerdown\", evt => this.#onClickPrompter(evt))\n this.#candidatesElement.addEventListener(\"pointerdown\", evt => this.#onClickCandidate(evt))\n document.addEventListener(\"pointerdown\", () => this.#onClickOutSide())\n }\n\n resize(): void\n {\n const mmToPixels = 3.779527559\n const marginTop = this.margin.top * mmToPixels\n const marginLeft = this.margin.left * mmToPixels\n const marginRight = this.margin.right * mmToPixels\n // 12 is the space between line in mm\n const top = marginTop - (12 * mmToPixels)\n\n this.#smartGuideElement.style.top = `${ top }px`\n this.#smartGuideElement.style.left = `${ marginLeft }px`\n this.#smartGuideElement.style.right = `${ marginRight }px`\n\n let left = this.#tagElement.offsetWidth\n this.#prompterContainerElement.style.marginLeft = `${ left }px`\n this.#prompterContainerElement.style.width = `${ this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight }px`\n left += this.#prompterContainerElement.offsetWidth\n this.#menuElement.style.left = `${ left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth }px`\n this.#menuElement.style.top = `${ this.#ellipsisElement.offsetHeight }px`\n this.#ellipsisElement.style.left = `${ left }px`\n }\n\n update(exports: TJIIXExport): void\n {\n this.jiix = exports\n const createWordSpan = (index: number, word?: TWordExport) =>\n {\n const span = document.createElement(\"span\")\n span.id = `word-${ index }${ this.uuid }`\n if (word) {\n span.textContent = word.label\n } else {\n span.innerHTML = \" \"\n }\n return span\n }\n\n const populatePrompter = () =>\n {\n this.#prompterTextElement.innerHTML = \"\"\n if (this.jiix?.words) {\n const words = this.jiix.words as TWordExport[]\n const myFragment = document.createDocumentFragment()\n words.forEach((word, index) =>\n {\n if (word.label === \" \" || word.label.includes(\"\\n\")) {\n myFragment.appendChild(createWordSpan(index))\n } else if (index !== words.length - 1) {\n myFragment.appendChild(createWordSpan(index, word))\n } else {\n this.#prompterTextElement.appendChild(myFragment)\n if (this.lastWord) {\n this.lastWord = word\n }\n const span = createWordSpan(index, word)\n // This is used to scroll to last word if last word is modified\n if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) {\n span.classList.add(\"added-word\")\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n this.lastWord = word\n } else {\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n }\n }\n })\n }\n }\n populatePrompter()\n if (this.jiix?.words?.length) {\n this.#show()\n }\n }\n\n clear(): void\n {\n this.#prompterTextElement.innerHTML = \"\"\n this.#candidatesElement.innerHTML = \"\"\n this.#hide()\n }\n\n destroy(): void\n {\n this.#smartGuideElement.innerHTML = \"\"\n }\n}\n","\nexport class DeferredPromise {\n promise: Promise\n resolve!: (value: T) => void\n reject!: (value: Error) => void\n\n isFullFilled: boolean\n isPending: boolean\n\n\n constructor()\n {\n this.isFullFilled = false\n this.isPending = true\n\n this.promise = new Promise((resolve, reject) =>\n {\n this.reject = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return reject(v)\n }\n this.resolve = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return resolve(v as T)\n }\n })\n }\n}\n","import { IGrabber } from \"../@types/grabber/Grabber\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TPointer } from \"../@types/geometry\"\n\nexport class PointerEventGrabber implements IGrabber\n{\n private configuration: TGrabberConfiguration\n\n private domElement!: HTMLElement\n\n private activePointerId?: number\n\n private prevent = (e: Event) => e.preventDefault()\n\n onPointerDown!: (evt: PointerEvent, point: TPointer) => void\n onPointerMove!: (evt: PointerEvent, point: TPointer) => void\n onPointerUp!: (evt: PointerEvent, point: TPointer) => void\n\n constructor(configuration: TGrabberConfiguration)\n {\n this.configuration = configuration\n }\n\n private roundFloat(oneFloat: number, requestedFloatPrecision: number): number\n {\n if (requestedFloatPrecision >= 0) {\n const floatPrecision: number = Math.pow(10, requestedFloatPrecision)\n return Math.round(oneFloat / floatPrecision) * floatPrecision\n }\n return oneFloat\n }\n\n private extractPoint(event: MouseEvent | TouchEvent): TPointer\n {\n let clientX: number, clientY: number\n if (\"changedTouches\" in event) {\n ({ clientX, clientY } = event.changedTouches[0])\n } else {\n ({ clientX, clientY } = event)\n }\n const rect: DOMRect = this.domElement.getBoundingClientRect()\n return {\n x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision),\n y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision),\n t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision),\n p: (event as PointerEvent).pressure || 1,\n\n }\n }\n\n private pointerDownHandler = (evt: PointerEvent) =>\n {\n // exit if not a left click or multi-touch\n if (evt.button !== 0 || evt.buttons !== 1) {\n return\n }\n\n this.activePointerId = evt.pointerId\n\n if (this.onPointerDown) {\n const point = this.extractPoint(evt)\n this.onPointerDown(evt, point)\n }\n }\n\n private pointerMoveHandler = (evt: PointerEvent) =>\n {\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n if (this.onPointerMove) {\n const point = this.extractPoint(evt)\n this.onPointerMove(evt, point)\n }\n }\n }\n\n private pointerUpHandler = (evt: PointerEvent) =>\n {\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n this.activePointerId = undefined\n evt.stopPropagation()\n if (this.onPointerUp) {\n const point = this.extractPoint(evt)\n this.onPointerUp(evt, point)\n }\n }\n }\n\n attach(domElement: HTMLElement)\n {\n if (this.domElement) {\n this.detach()\n }\n this.domElement = domElement\n this.domElement.addEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement.addEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n\n this.domElement.addEventListener(\"touchmove\", this.prevent)\n\n // FIXME investigate why this is needed for iOS devices\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.addEventListener(\"pointerdown\", () => { })\n }\n\n detach()\n {\n this.domElement?.removeEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement?.removeEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"touchmove\", this.prevent)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.removeEventListener(\"pointerdown\", () => { })\n }\n}\n","\nimport { TPoint } from \"../../@types/geometry\"\nimport { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const ShapeSymbols = {\n table: \"table\",\n shape: \"shape\",\n recognizedShape: \"recognizedShape\",\n ellipse: \"ellipse\",\n line: \"line\"\n}\n\nfunction phi(angle: number): number\n{\n let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI\n if (returnedAngle < -Math.PI) {\n returnedAngle += Math.PI * 2\n }\n return returnedAngle\n}\n\nfunction drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[]\n{\n const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse\n const angleStep = 0.02 // angle delta between interpolated\n\n let z1 = Math.cos(orientation)\n let z3 = Math.sin(orientation)\n let z2 = z1\n let z4 = z3\n z1 *= maxRadius\n z2 *= minRadius\n z3 *= maxRadius\n z4 *= minRadius\n\n const n = Math.floor(Math.abs(sweepAngle) / angleStep)\n\n const boundariesPoints = []\n\n context2D.save()\n try {\n context2D.beginPath()\n\n for (let i = 0; i <= n; i++) {\n const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian\n const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius)\n\n const cosAlpha = Math.cos(alpha)\n const sinAlpha = Math.sin(alpha)\n\n // current point\n const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha)\n const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha)\n if (i === 0) {\n context2D.moveTo(x, y)\n } else {\n context2D.lineTo(x, y)\n }\n\n if (i === 0 || i === n) {\n boundariesPoints.push({ x, y })\n }\n }\n\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n\n return boundariesPoints\n}\n\nfunction drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number)\n{\n const alpha = phi(angle + (Math.PI * (7 / 8)))\n const beta = phi(angle - (Math.PI * (7 / 8)))\n context2D.save()\n try {\n context2D.fillStyle = context2D.strokeStyle\n\n context2D.moveTo(headPoint.x, headPoint.y)\n context2D.beginPath()\n context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha)))\n context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta)))\n context2D.lineTo(headPoint.x, headPoint.y)\n context2D.fill()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol)\n{\n const points = drawEllipseArc(context2D, shapeEllipse)\n\n if (shapeEllipse?.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0)\n }\n if (shapeEllipse?.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a line\n * @param {Object} context2D Current rendering context2D\n * @param {{x: Number, y: Number}} p1 Origin point\n * @param {{x: Number, y: Number}} p2 Destination point\n */\nexport function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint)\n{\n context2D.save()\n try {\n context2D.beginPath()\n context2D.moveTo(p1.x, p1.y)\n context2D.lineTo(p2.x, p2.y)\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol)\n{\n drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint)\n if (shapeLine.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0)\n }\n if (shapeLine.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a shape symbol\n * @param {Object} context2D Current rendering context2D\n * @param {Object} symbol Symbol to draw\n */\nexport function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = symbol.style.width as number\n context2D.strokeStyle = symbol.style.color as string\n\n if (symbol.elementType) {\n switch (symbol.elementType) {\n case ShapeSymbols.shape: {\n const shapeSymbol = symbol as TShapeSymbol\n drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex])\n break\n }\n case ShapeSymbols.table:{\n const tableSymbols = symbol as TShapeTableSymbol\n tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line))\n break\n }\n case ShapeSymbols.line: {\n const lineSymbol = symbol as TLineSymbol\n drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2)\n break\n }\n default:\n // logger.error(`${ symbol.elementType } not implemented`)\n break\n }\n } else {\n switch (symbol.type) {\n case ShapeSymbols.ellipse: {\n drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol)\n break\n }\n case ShapeSymbols.line: {\n drawShapeLine(context2D, symbol as TShapeLineSymbol)\n break\n }\n case ShapeSymbols.recognizedShape: {\n const recognizedShape = symbol as TShapeRecognizedSymbol\n recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive))\n break\n }\n default:\n // logger.error(`${ symbol.type } not implemented`)\n break\n }\n }\n } finally {\n context2D.restore()\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) {\n if (stroker && stroke && stroke.pointerType !== \"eraser\") {\n stroker.drawStroke(context2D, stroke)\n }\n}\n","import { TPoint } from \"../../@types/geometry\"\nimport { drawLine } from \"./CanvasRendererShapeSymbol\"\nimport { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const TextSymbols = {\n inputCharacter: \"inputCharacter\",\n char: \"char\",\n string: \"string\",\n textLine: \"textLine\"\n}\n\nfunction drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol)\n{\n const delta = data.width / label.length\n const p1: TPoint = {\n x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n const p2: TPoint = {\n x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n drawLine(context2D, p1, p2)\n}\n\nfunction drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol)\n{\n context2D.save()\n try {\n context2D.font = `${ data.textHeight }px serif`\n context2D.textAlign = (data.justificationType === \"CENTER\") ? \"center\" : \"left\"\n context2D.textBaseline = \"bottom\"\n context2D.fillStyle = context2D.strokeStyle\n context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height))\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol)\n{\n drawText(context2D, textLine.label, textLine.data)\n textLine.underlineList.forEach((underline) =>\n {\n drawUnderline(context2D, underline, textLine.label, textLine.data)\n })\n}\n\n/**\n * Draw a text symbol\n * @param {Object} context Current rendering context\n * @param {Object} symbol Symbol to draw\n */\nexport function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = (symbol.style.width as number)\n context2D.strokeStyle = (symbol.style.color as string)\n const type: string = symbol.elementType || symbol.type\n\n switch (type) {\n case TextSymbols.textLine:\n drawTextLine(context2D, symbol as TTextUnderlineSymbol)\n break\n default:\n console.info(`drawTextSymbol => ${symbol.elementType} not implemented`)\n break\n }\n\n } finally {\n context2D.restore()\n }\n}\n","import { TPoint, TPointer } from \"../@types/geometry\"\n\nexport function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]\n{\n const radius = point.p * width\n return [\n {\n x: (point.x - (Math.sin(angle) * radius)),\n y: (point.y + (Math.cos(angle) * radius))\n },\n {\n x: (point.x + (Math.sin(angle) * radius)),\n y: (point.y - (Math.cos(angle) * radius))\n }\n ]\n}\n\nexport function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer\n{\n return {\n x: ((point2.x + point1.x) / 2),\n y: ((point2.y + point1.y) / 2),\n p: ((point2.p + point1.p) / 2),\n t: ((point2.t + point1.t) / 2)\n }\n}\n\nexport function computeAxeAngle(begin: TPointer, end: TPointer): number\n{\n return Math.atan2(end.y - begin.y, end.x - begin.x)\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class CanvasStroker\n{\n\n private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void\n {\n context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true)\n }\n\n private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y)\n }\n\n private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n context2d.moveTo(linkPoints[0].x, linkPoints[0].y)\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - ((i * Math.PI) / ARCSPLIT)\n context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle)))\n }\n }\n\n private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width)\n const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y)\n }\n\n drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void\n {\n const NUMBER_POINTS = stroke.pointers.length\n const NUMBER_QUADRATICS = NUMBER_POINTS - 2\n const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth\n const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle\n const firstPoint = stroke.pointers[0] as TPointer\n\n context2d.save()\n try {\n context2d.beginPath()\n if (NUMBER_POINTS < 3) {\n this.renderArc(context2d, firstPoint, width * 0.6)\n } else {\n this.renderArc(context2d, firstPoint, width * firstPoint.p)\n const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1])\n this.renderLine(context2d, firstPoint, secondPoint, width)\n\n // Possibility to try this (the start looks better when the ink is large)\n // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]);\n // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true);\n\n for (let i = 0; i < NUMBER_QUADRATICS; i++) {\n const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const ctrl: TPointer = stroke.pointers[i + 1]\n this.renderQuadratic(context2d, begin, end, ctrl, width)\n }\n const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1])\n const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderLine(context2d, beginLine, endLine, width)\n\n const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2]\n const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderFinal(context2d, beginFinal, endFinal, width)\n }\n context2d.closePath()\n if (color !== undefined) {\n context2d.fillStyle = color\n context2d.fill()\n }\n context2d.save()\n }\n finally {\n context2d.restore()\n }\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TSymbol } from \"../../@types/renderer/Symbol\"\n\nimport { drawShapeSymbol, ShapeSymbols } from \"./CanvasRendererShapeSymbol\"\nimport { drawStroke } from \"./CanvasRendererStrokeSymbol\"\nimport { drawTextSymbol, TextSymbols } from \"./CanvasRendererTextSymbol\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport class CanvasRenderer\n{\n config: TRenderingConfiguration\n stroker: CanvasStroker\n context!: {\n parent: HTMLElement\n renderingCanvas: HTMLCanvasElement\n renderingCanvasContext: CanvasRenderingContext2D\n capturingCanvas: HTMLCanvasElement\n capturingCanvasContext: CanvasRenderingContext2D\n }\n\n constructor(config: TRenderingConfiguration)\n {\n this.config = config\n this.stroker = new CanvasStroker()\n }\n\n private createCanvas(type: string): HTMLCanvasElement\n {\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\")\n canvas.id = type\n canvas.classList.add(type)\n canvas.classList.add(\"ms-canvas\")\n return canvas\n }\n\n private resizeContent(): void\n {\n const pixelRatio: number = window.devicePixelRatio\n const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas]\n elements.forEach((canvas) =>\n {\n const domElement = canvas.parentNode as HTMLElement\n const width = Math.max(this.config.minWidth, domElement.clientWidth)\n const height = Math.max(this.config.minHeight, domElement.clientHeight)\n canvas.width = width * pixelRatio\n canvas.height = height * pixelRatio\n canvas.getContext(\"2d\")?.scale(pixelRatio, pixelRatio)\n canvas.style.width = `${ width }px`\n canvas.style.height = `${ height }px`\n })\n }\n\n private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n {\n const type = symbol.elementType || symbol.type\n if (type === \"stroke\") {\n drawStroke(context2D, symbol as TStroke, this.stroker)\n } else if (Object.keys(TextSymbols).includes(type)) {\n drawTextSymbol(context2D, symbol)\n } else if (Object.keys(ShapeSymbols).includes(type)) {\n drawShapeSymbol(context2D, symbol)\n }\n }\n\n init(element: HTMLElement): void\n {\n const renderingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-rendering-canvas\")\n element.appendChild(renderingCanvas)\n\n const capturingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-capture-canvas\")\n element.appendChild(capturingCanvas)\n\n this.context = {\n parent: element,\n renderingCanvas,\n renderingCanvasContext: renderingCanvas.getContext(\"2d\") as CanvasRenderingContext2D,\n capturingCanvas,\n capturingCanvasContext: capturingCanvas.getContext(\"2d\") as CanvasRenderingContext2D\n }\n\n this.resizeContent()\n }\n\n drawModel(model: IModel): void\n {\n this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height)\n model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol))\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n }\n\n drawPendingStroke(stroke: TStroke | undefined): void\n {\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n if (stroke && stroke?.pointerType !== \"eraser\") {\n this.stroker.drawStroke(this.context.capturingCanvasContext, stroke)\n }\n }\n\n resize(model: IModel): void\n {\n this.resizeContent()\n this.drawModel(model)\n }\n\n destroy(): void\n {\n if (this.context.parent) {\n this.context.parent.innerHTML = \"\"\n }\n }\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.JsonCSS=e():t.JsonCSS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=1)}([function(t,e,n){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i=function t(e){var n=this;o(this,t),this.toJSON=function(t){if(\"string\"!=typeof t)return console.error(\"Need a CSS string but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid CSS..!\";var e={},o=void 0,i=void 0,u=void 0;try{t.split(\"{\").forEach(function(t){if(i=t.trim())if(-1===i.indexOf(\"}\"))e[i]={},o=i;else{i.substring(0,i.indexOf(\"}\")).split(\";\").forEach(function(t){(u=t.split(\":\"))&&2===u.length&&(e[o][u[0].trim().replace(/^\\\"|\\\"$/g,\"\")]=n._trimSemiColon(u[1].trim().replace(/^\\\"|\\\"$/g,\"\")))});try{o=i.split(\"}\")[1].trim(),o&&(e[o]={})}catch(t){}}})}catch(t){return\"Not a valid CSS..!\"}return e},this.toCSS=function(t){if(\"object\"!==(void 0===t?\"undefined\":r(t)))return console.error(\"Need a JSON object but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid JSON..!\";var e=\"\";try{for(var n in t)if(t.hasOwnProperty(n)){e+=n+\" {\\n\";for(var o in t[n])t[n].hasOwnProperty(o)&&(e+=o+\": \"+t[n][o]+\";\\n\");e+=\"}\\n\"}}catch(t){return\"Not a valid JSON..!\"}return e},this._trimSemiColon=function(t){return\";\"===t.slice(-1)?t.slice(0,n.length-1):t}};e.default=i},function(t,e,n){\"use strict\";t.exports=n(0).default}])});","import JsonCSS from \"json-css\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parser: any = new JsonCSS()\n\nexport default {\n themeToCSS(json: TTheme): string\n {\n return parser.toCSS(json) as string\n // css = css.replace( /[\\r\\n]+/gm, \"\" )\n // return css\n },\n themeToJSON(style: string): TTheme\n {\n const theme = parser.toJSON(style) as TTheme\n theme[\".text\"][\"font-size\"] = Number(theme[\".text\"][\"font-size\"])\n theme.ink[\"-myscript-pen-width\"] = Number(theme.ink[\"-myscript-pen-width\"])\n theme.ink.width = Number(theme.ink.width)\n return theme\n },\n penStyleToCSS (penStyle: TPenStyle): string {\n let css = parser.toCSS({ css: penStyle }) as string\n css = css.substring(6, css.length - 3)\n return css\n },\n penStyleToJSON (penStyleString: string): TPenStyle {\n const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle\n if (penStyle.width) {\n penStyle.width = Number(penStyle.width)\n } else {\n delete penStyle.width\n }\n if (penStyle[\"-myscript-pen-width\"]) {\n penStyle[\"-myscript-pen-width\"] = Number(penStyle[\"-myscript-pen-width\"])\n } else {\n delete penStyle[\"-myscript-pen-width\"]\n }\n return penStyle\n },\n\n stringToJSON(style: string): {[key: string]: string}\n {\n return parser.toJSON(`css {${style}}`).css\n },\n JSONToString(style: {[key: string]: string}): string\n {\n return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(\";\")\n }\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA512;\n\n}));","import Hex from \"crypto-js/enc-hex\"\nimport HmacSHA512 from \"crypto-js/hmac-sha512\"\n\nexport function computeHmac (message: string, applicationKey: string, hmacKey: string): string {\n const hmac = new HmacSHA512(message, applicationKey + hmacKey)\n return hmac.toString(Hex) as string\n}\n","\nexport const isVersionSuperiorOrEqual = (source: string, target: string): boolean =>\n{\n const sourceParts = source.split(\".\")\n const targetParts = target.split(\".\")\n\n for (let i = 0; i < targetParts.length; i++) {\n const a = Number(targetParts[i])\n const b = Number(sourceParts[i])\n if (a > b) return false\n if (a < b) return true\n }\n return true\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TStroke, TStrokeJSON } from \"../@types/model/Stroke\"\nimport { TPointer } from \"../@types/geometry\"\n\nexport class Stroke implements TStroke\n{\n id: string\n type: string\n pointerId: number\n pointerType: string\n elementType?: string\n pointers: TPointer[]\n length: number\n style: TPenStyle\n\n constructor(style: TPenStyle, pointerId: number, pointerType = \"pen\")\n {\n this.id = `${pointerType}-${Date.now().toString()}`\n this.type = \"stroke\"\n this.pointerId = pointerId\n this.pointerType = pointerType\n this.pointers = []\n this.length = 0\n this.style = style\n }\n}\n\nexport function convertStrokeToJSON(stroke: TStroke): TStrokeJSON\n{\n const json: TStrokeJSON = {\n id: stroke.id,\n pointerType: stroke.pointerType,\n p: [],\n t: [],\n x: [],\n y: []\n }\n stroke.pointers.forEach(p => {\n json.p.push(p.p)\n json.t.push(p.t)\n json.x.push(p.x)\n json.y.push(p.y)\n })\n return json\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TRestPostConfiguration, TRestPostData } from \"../@types/recognizer/RestRecognizer\"\nimport { TStrokeGroup, TStrokeGroupJSON } from \"../@types/model/Stroke\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport StyleHelper from \"../style/StyleHelper\"\nimport { computeHmac } from \"./CryptoHelper\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\ntype ApiError = {\n code?: string\n message: string\n}\n\nexport class RestRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n }\n\n get url()\n {\n return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch`\n }\n\n get postConfig(): TRestPostConfiguration\n {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n return {\n lang: this.recognitionConfiguration.lang,\n diagram: this.recognitionConfiguration.diagram,\n export: this.recognitionConfiguration.export\n }\n case \"MATH\":\n return {\n lang: this.recognitionConfiguration.lang,\n math: this.recognitionConfiguration.math,\n export: this.recognitionConfiguration.export\n }\n case \"Raw Content\":\n return {\n lang: this.recognitionConfiguration.lang,\n \"raw-content\": this.recognitionConfiguration[\"raw-content\"],\n export: this.recognitionConfiguration.export\n }\n case \"TEXT\":\n return {\n lang: this.recognitionConfiguration.lang,\n text: this.recognitionConfiguration.text,\n export: this.recognitionConfiguration.export\n }\n default:\n throw new Error(`get postConfig error Recognition type unkow \"${ this.recognitionConfiguration.type }\"`)\n break\n }\n }\n\n private buildData(model: IModel): TRestPostData\n {\n const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) =>\n {\n return ps1[\"-myscript-pen-fill-color\"] === ps2[\"-myscript-pen-fill-color\"] &&\n ps1[\"-myscript-pen-fill-style\"] === ps2[\"-myscript-pen-fill-style\"] &&\n ps1[\"-myscript-pen-width\"] === ps2[\"-myscript-pen-width\"] &&\n ps1.color === ps2.color &&\n ps1.width === ps2.width\n }\n\n const strokeGroupByPenStyle: TStrokeGroup[] = []\n model.rawStrokes.forEach((s) => {\n const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style))\n if (groupIndex > -1) {\n strokeGroupByPenStyle[groupIndex].strokes.push(s)\n } else {\n strokeGroupByPenStyle.push({\n penStyle: s.style,\n strokes: [s]\n })\n }\n })\n\n const strokeGroupsToSend: TStrokeGroupJSON[] = []\n strokeGroupByPenStyle.forEach((group: TStrokeGroup) =>\n {\n const newPenStyle = JSON.stringify(group.penStyle) === \"{}\" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle)\n const newGroup = {\n penStyle: newPenStyle,\n strokes: group.strokes.map(convertStrokeToJSON)\n }\n strokeGroupsToSend.push(newGroup)\n })\n\n const contentType: string = this.recognitionConfiguration.type === \"Raw Content\" ?\n \"Raw Content\" :\n this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase()\n\n return {\n configuration: this.postConfig,\n xDPI: 96,\n yDPI: 96,\n contentType,\n // theme: StyleHelper.themeToCSS(),\n height: model.height,\n width: model.width,\n strokeGroups: strokeGroupsToSend\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async post(data: any, mimeType: string): Promise\n {\n const headers = new Headers()\n headers.append(\"Accept\", \"application/json,\" + mimeType)\n headers.append(\"applicationKey\", this.serverConfiguration.applicationKey)\n headers.append(\"hmac\", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey))\n headers.append(\"Content-Type\", \"application/json\")\n\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n headers.append(\"myscript-client-name\", \"iink-ts\")\n headers.append(\"myscript-client-version\", \"1.0.0-buildVersion\")\n }\n\n const reqInit: RequestInit = {\n method: \"POST\",\n headers,\n body: JSON.stringify(data)\n }\n const request = new Request(this.url, reqInit)\n const response: Response = await fetch(request)\n if (response.ok) {\n const contentType = response.headers.get(\"content-type\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any\n switch (contentType) {\n case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n case \"image/png\":\n case \"image/jpeg\":\n result = await response.blob()\n break\n case \"application/json\":\n result = await response.json()\n break\n case \"application/vnd.myscript.jiix\":\n result = await response.clone().json().catch(async () => await response.text())\n break\n default:\n result = await response.text()\n break\n }\n return result\n } else {\n const err = await response.json() as ApiError\n throw err\n }\n }\n\n private async tryFetch(data: unknown, mimeType: string): Promise\n {\n return this.post(data, mimeType)\n .then((res) =>\n {\n const exports: TExport = {}\n exports[mimeType] = res as TJIIXExport | string | Blob\n return exports\n })\n .catch((err) =>\n {\n let message = err.message || ErrorConst.UNKNOW\n if (!err.code) {\n message = ErrorConst.CANT_ESTABLISH\n } else if (err.code === \"access.not.granted\") {\n message = ErrorConst.WRONG_CREDENTIALS\n }\n const error = new Error(message)\n throw error\n })\n }\n\n private getMimeTypes(requestedMimeTypes?: string[]): string[]\n {\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n break\n }\n }\n return mimeTypes\n }\n\n async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n const myModel = model.getClone()\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n const dataToConcert = this.buildData(myModel)\n dataToConcert.conversionState = conversionState\n const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt))\n const converts: TExport[] = await Promise.all(promises)\n converts.forEach(c =>\n {\n myModel.mergeConvert(c)\n })\n return myModel\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n const myModel = model.getClone()\n if (myModel.rawStrokes.length === 0) {\n return Promise.resolve(myModel)\n }\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n if (!mimeTypes.length) {\n return Promise.reject(new Error(\"Export failed, no mimeTypes define in recognition configuration\"))\n }\n const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m])\n const data = this.buildData(model)\n const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType)))\n exports.forEach(e =>\n {\n myModel.mergeExport(e)\n })\n return myModel\n }\n\n async resize(model: IModel): Promise\n {\n return this.export(model)\n }\n\n}\n","import { IModel } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\n\nexport class UndoRedoContext implements TUndoRedoContext\n{\n canUndo: boolean\n canRedo: boolean\n empty: boolean\n stackIndex: number\n possibleUndoCount: number\n stack: IModel[]\n\n constructor(model: IModel)\n {\n this.stackIndex = 0\n this.possibleUndoCount = 0\n this.canRedo = false\n this.canUndo = false\n this.empty = true\n this.stack = [model.getClone()]\n }\n}\n","import { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { IModel } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { UndoRedoContext } from \"./UndoRedoContext\"\n\nexport class UndoRedoManager\n{\n context: UndoRedoContext\n configuration: TUndoRedoConfiguration\n\n constructor(configuration: TUndoRedoConfiguration, model: IModel)\n {\n this.configuration = configuration\n this.context = new UndoRedoContext(model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n private updateCanUndoRedo(): void\n {\n this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex\n this.context.canUndo = this.context.stackIndex > 0\n const currentModel = this.context.stack[this.context.stackIndex]\n this.context.empty = currentModel.rawStrokes.length === 0\n }\n\n addModelToStack(model: IModel): void\n {\n if (this.context.stackIndex + 1 < this.context.stack.length) {\n this.context.stack.splice(this.context.stackIndex + 1)\n }\n\n this.context.stackIndex++\n this.context.stack.push(model.getClone())\n\n if (this.context.stack.length > this.configuration.maxStackSize) {\n this.context.stack.shift()\n this.context.stackIndex--\n }\n\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n\n removeLastModelInStack(): void\n {\n if (this.context.stackIndex === this.context.stack.length - 1) {\n this.context.stackIndex--\n }\n this.context.stack.pop()\n this.updateCanUndoRedo()\n }\n\n updateModelInStack(model: IModel): void\n {\n const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate)\n if (index > -1) {\n this.context.stack.splice(index, 1, model.getClone())\n }\n this.internalEvent.emitContextChange(this.context)\n }\n\n undo(): IModel\n {\n if (this.context.canUndo) {\n this.context.stackIndex--\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n return this.context.stack[this.context.stackIndex].getClone()\n }\n\n redo(): IModel\n {\n if (this.context.canRedo) {\n this.context.stackIndex++\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n return this.context.stack[this.context.stackIndex].getClone()\n }\n\n reset(model: IModel): void\n {\n this.context = new UndoRedoContext(model)\n this.internalEvent.emitContextChange(this.context)\n }\n\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const mergeDeep = (target: any, ...sources: any[]): any =>\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isObject = (item: any) =>\n {\n return (item && typeof item === \"object\" && !Array.isArray(item))\n }\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n mergeDeep(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return mergeDeep(target, ...sources)\n }","import { TPenStyle } from \"../@types/style/PenStyle\"\n\nexport const DefaultPenStyle: TPenStyle = {}","import { TTheme } from \"../@types/style/Theme\"\n\nexport const DefaultTheme: TTheme = {\n ink: {\n color: \"#000000\",\n width: 1,\n \"-myscript-pen-width\": 1,\n \"-myscript-pen-fill-style\": \"none\",\n \"-myscript-pen-fill-color\": \"#FFFFFF00\"\n },\n \".math\": {\n \"font-family\": \"STIXGeneral\"\n },\n \".math-solved\": {\n \"font-family\": \"STIXGeneral\",\n color: \"#A8A8A8FF\"\n },\n \".text\": {\n \"font-family\": \"MyScriptInter\",\n \"font-size\": 10\n }\n}\n","import { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nimport { DefaultPenStyle } from \"./DefaultPenStyle\"\nimport { DefaultTheme } from \"./DefaultTheme\"\n\nexport class StyleManager\n{\n #penStyle!: TPenStyle\n #theme!: TTheme\n #penStyleClasses!: string\n #currentPenStyle!: TPenStyle\n\n constructor(penStyle?: TPenStyle, theme?: TTheme)\n {\n this.setTheme(theme)\n this.setPenStyleClasses()\n this.setPenStyle(penStyle)\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.#currentPenStyle || this.#penStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.#penStyle\n }\n setPenStyle(p?: TPenStyle)\n {\n\n this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), p || {}) as TPenStyle\n this.#currentPenStyle = p || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n }\n\n get theme(): TTheme\n {\n return this.#theme\n }\n setTheme(t?: TTheme)\n {\n this.#theme = mergeDeep(structuredClone(DefaultTheme), t || {}) as TTheme\n }\n\n get penStyleClasses(): string\n {\n return this.#penStyleClasses\n }\n setPenStyleClasses(psc = \"\")\n {\n this.#penStyleClasses = psc\n this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n }\n\n}\n","import { TConfiguration } from \"../@types/Configuration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\n\nexport const DefaultServerConfiguration: TServerConfiguration = {\n protocol: \"WEBSOCKET\",\n scheme: \"https\",\n host: \"cloud.myscript.com\",\n applicationKey: \"\",\n hmacKey: \"\",\n version: \"2.1.0\",\n useWindowLocation: false,\n websocket: {\n pingEnabled: true,\n pingDelay: 30000,\n maxPingLostCount: 10,\n autoReconnect: true,\n maxRetryCount: 2,\n fileChunkSize: 300000\n }\n}\n\nexport const DefaultRecognitionConfiguration: TRecognitionConfiguration = {\n type: \"TEXT\",\n alwaysConnected: true,\n lang: \"en_US\",\n gesture: {\n enable: true\n },\n export: {\n \"image-resolution\": 300,\n jiix: {\n \"bounding-box\": false,\n strokes: false,\n text: {\n chars: false,\n words: true\n }\n },\n },\n renderer: {\n debug: {\n \"draw-text-boxes\": false,\n \"draw-image-boxes\": false\n }\n },\n math: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/mathml+xml\", \"application/x-latex\" ,\n solver: {\n enable: true,\n \"fractional-part-digits\": 3,\n \"decimal-separator\": \".\",\n \"rounding-mode\": \"half up\",\n \"angle-unit\": \"deg\"\n },\n margin: {\n bottom: 10,\n left: 15,\n right: 15,\n top: 10\n },\n eraser: {\n \"erase-precisely\": false\n },\n \"undo-redo\": {\n mode: \"stroke\"\n }\n },\n text: {\n guides: {\n enable: true\n },\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"text/plain\"\n margin: {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n },\n eraser: {\n \"erase-precisely\": false\n }\n },\n diagram: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n eraser: {\n \"erase-precisely\": false\n },\n convert: {\n \"match-text-size\": true\n }\n },\n \"raw-content\": {\n recognition: {\n text: true,\n shape: true\n },\n eraser: {\n \"erase-precisely\": false\n }\n }\n}\n\nexport const DefaultGrabberConfiguration: TGrabberConfiguration = {\n listenerOptions: {\n capture: false,\n passive: true\n },\n xyFloatPrecision: 0,\n timestampFloatPrecision: 0\n}\n\nexport const DefaultRenderingConfiguration: TRenderingConfiguration = {\n minHeight: 100,\n minWidth: 100,\n smartGuide: {\n enable: true,\n fadeOut: {\n enable: false,\n duration: 5000\n }\n },\n guides: {\n enable: true,\n gap: 50\n }\n}\n\nexport const DefaultTriggerConfiguration: TTriggerConfiguration = {\n exportContent: \"POINTER_UP\",\n exportContentDelay: 1000,\n resizeTriggerDelay: 100\n}\n\nexport const DefaultEventsConfiguration: TEventConfiguration = {\n processDelay: 10\n}\n\nexport const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = {\n maxStackSize: 100\n}\n\nexport const DefaultConfiguration: TConfiguration = {\n server: DefaultServerConfiguration,\n recognition: DefaultRecognitionConfiguration,\n grabber: DefaultGrabberConfiguration,\n rendering: DefaultRenderingConfiguration,\n triggers: DefaultTriggerConfiguration,\n events: DefaultEventsConfiguration,\n \"undo-redo\": DefaultUndoRedoConfiguration\n}\n","\nimport { TConfiguration, TConfigurationClient } from \"../@types/Configuration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { DefaultConfiguration } from \"./DefaultConfiguration\"\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nexport class Configuration implements TConfiguration\n{\n events: TEventConfiguration\n grabber: TGrabberConfiguration\n recognition: TRecognitionConfiguration\n rendering: TRenderingConfiguration\n server: TServerConfiguration\n triggers: TTriggerConfiguration\n \"undo-redo\": TUndoRedoConfiguration\n\n constructor(configuration?: TConfigurationClient)\n {\n this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events))\n this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber))\n this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition))\n this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering))\n this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server))\n this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers))\n\n this.overrideDefaultConfiguration(configuration)\n }\n\n\n\n overrideDefaultConfiguration(configuration?: TConfigurationClient): void\n {\n const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration))\n this.events = mergeDeep({}, defaultConf.events, configuration?.events)\n this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber)\n this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition)\n this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering)\n this.server = mergeDeep({}, defaultConf.server, configuration?.server)\n this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers)\n this[\"undo-redo\"] = mergeDeep({}, defaultConf[\"undo-redo\"], configuration?.[\"undo-redo\"])\n\n this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes\n this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes\n this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes\n\n if (this.server?.useWindowLocation) {\n this.server.scheme = window.location.protocol.indexOf(\"s\") > -1 ? \"https\" : \"http\"\n this.server.host = window.location.host\n }\n\n if (\n this.server.protocol === \"REST\" &&\n this.triggers.exportContent === \"POINTER_UP\"\n ) {\n this.triggers.exportContent = \"QUIET_PERIOD\"\n this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50)\n }\n\n if (\n this.server.protocol === \"WEBSOCKET\" &&\n this.recognition.type === \"TEXT\"\n ) {\n if (\n this.rendering.smartGuide.enable &&\n !this.recognition.text.mimeTypes.includes(\"application/vnd.myscript.jiix\")\n ) {\n // mimeType required for smartGuide\n this.recognition.text.mimeTypes.push(\"application/vnd.myscript.jiix\")\n }\n } else {\n // smartGuide enable only on websocket text\n this.rendering.smartGuide.enable = false\n }\n }\n}\n","import { TPoint } from \"../@types/geometry\"\n\nexport function computeDistance(p1: TPoint, p2: TPoint): number\n{\n const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x)\n return isNaN(distance) ? 0 : distance\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPoint, TPointer } from \"../@types/geometry\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TRecognitionPositions } from \"../@types/model/RecognitionPositions\"\n\nimport { computeDistance } from \"../utils/geometric\"\nimport { Stroke } from \"./Stroke\"\n\nexport class Model implements IModel\n{\n readonly creationTime: number\n modificationDate: number\n currentStroke?: TStroke\n positions: TRecognitionPositions\n rawStrokes: TStroke[]\n selectedStrokes: TStroke[]\n exports?: TExport\n converts?: TExport\n width: number\n height: number\n idle: boolean\n\n constructor(width = 100, height = 100, creationDate: number = Date.now())\n {\n this.creationTime = creationDate\n this.modificationDate = creationDate\n this.width = width\n this.height = height\n this.rawStrokes = []\n this.selectedStrokes = []\n this.positions = {\n lastSentPosition: 0,\n lastReceivedPosition: 0\n }\n this.idle = true\n }\n\n mergeExport(exports: TExport)\n {\n if (this.exports) {\n Object.assign(this.exports, exports)\n } else {\n this.exports = exports\n }\n }\n\n mergeConvert(converts: TExport)\n {\n if (this.converts) {\n Object.assign(this.converts, converts)\n } else {\n this.converts = converts\n }\n }\n\n private computePressure(distance: number, globalDistance: number): number\n {\n let ratio = 1.0\n if (globalDistance === 0) {\n ratio = 0.5\n } else if (distance === globalDistance) {\n ratio = 1.0\n } else if (distance < 10) {\n ratio = 0.2 + Math.pow(0.1 * distance, 0.4)\n } else if (distance > globalDistance - 10) {\n ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4)\n }\n const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance)))\n return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100\n }\n\n private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean\n {\n const delta: number = (2 + ((stroke.style[\"-myscript-pen-width\"] || 0) / 4))\n return !lastPointer ||\n stroke.pointers.length === 0 ||\n Math.abs(lastPointer.x - point.x) >= delta ||\n Math.abs(lastPointer.y - point.y) >= delta\n }\n\n addPoint(stroke: TStroke, pointer: TPointer): void\n {\n const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 }\n if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) {\n const distance = computeDistance(pointer, lastPointer)\n stroke.length += distance\n pointer.p = this.computePressure(distance, stroke.length)\n stroke.pointers.push(pointer)\n }\n }\n\n addStroke(stroke: TStroke): void\n {\n this.rawStrokes.push(stroke)\n }\n\n extractUnsentStrokes(): TStroke[]\n {\n return this.rawStrokes.slice(this.positions.lastSentPosition)\n }\n\n initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void\n {\n if (style[\"-myscript-pen-width\"]) {\n const pxWidth = (style[\"-myscript-pen-width\"] * dpi) / 25.4\n style.width = pxWidth / 2\n }\n this.modificationDate = Date.now()\n this.exports = undefined\n this.converts = undefined\n this.currentStroke = new Stroke(style, pointerId, pointerType)\n this.addPoint(this.currentStroke, point)\n }\n\n appendToCurrentStroke(point: TPointer): void\n {\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n }\n }\n\n endCurrentStroke(point: TPointer): void\n {\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n this.addStroke(this.currentStroke)\n this.currentStroke = undefined\n }\n }\n\n #getStrokeFromPoint(point: TPoint): TStroke[]\n {\n const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max)\n\n const _strokeList: TStroke[] = []\n this.rawStrokes.forEach((stroke) =>\n {\n for (let i = 0; i < stroke.pointers.length; i++) {\n const strokePointer = stroke.pointers[i]\n if (\n isBetween(strokePointer.x, point.x - 5, point.x + 5) &&\n isBetween(strokePointer.y, point.y - 5, point.y + 5)\n ) {\n _strokeList.push(stroke)\n break\n }\n else {\n if (computeDistance(point, strokePointer) < 10) {\n _strokeList.push(stroke)\n break\n }\n }\n }\n })\n return _strokeList\n }\n\n resetSelectedStrokes(): void\n {\n this.selectedStrokes = []\n }\n\n appendSelectedStrokesFromPoint(point: TPoint): void\n {\n this.#getStrokeFromPoint(point)\n .forEach(s =>\n {\n if (!this.selectedStrokes.includes(s)) {\n this.selectedStrokes.push(s)\n }\n })\n }\n\n updateStroke(updatedStroke: TStroke): void\n {\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1, updatedStroke)\n }\n }\n\n removeStroke(id: string): void\n {\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1)\n }\n }\n\n removeStrokesFromPoint(point: TPoint): string[]\n {\n const strokes = this.#getStrokeFromPoint(point)\n strokes.forEach(strokeToRemove =>\n {\n this.removeStroke(strokeToRemove.id)\n })\n return strokes.map(s => s.id)\n }\n\n updatePositionSent(position: number = this.rawStrokes.length): void\n {\n this.positions.lastSentPosition = position\n }\n\n updatePositionReceived(): void\n {\n this.positions.lastReceivedPosition = this.positions.lastSentPosition\n }\n\n getClone(): IModel\n {\n const clonedModel = new Model(this.width, this.height, this.creationTime)\n clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate))\n clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined\n clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes))\n clonedModel.positions = JSON.parse(JSON.stringify(this.positions))\n clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined\n clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined\n clonedModel.idle = this.idle\n return clonedModel\n }\n\n clear(): void\n {\n this.modificationDate = Date.now()\n this.currentStroke = undefined\n this.rawStrokes = []\n this.positions.lastSentPosition = 0\n this.positions.lastReceivedPosition = 0\n this.exports = undefined\n this.converts = undefined\n this.idle = true\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TConfiguration } from \"../@types/Configuration\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { CanvasRenderer } from \"../renderer/canvas/CanvasRenderer\"\nimport { RestRecognizer } from \"../recognizer/RestRecognizer\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { UndoRedoManager } from \"../undo-redo/UndoRedoManager\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { ModeInteraction } from \"../Constants\"\n\nexport class RestBehaviors implements IBehaviors\n{\n name = \"RestBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: CanvasRenderer\n recognizer: RestRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n mode: ModeInteraction\n\n #resizeTimer?: ReturnType\n #exportTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new CanvasRenderer(this.#configuration.rendering)\n this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.mode = ModeInteraction.Writing\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(ps?: TPenStyle)\n {\n this.styleManager.setPenStyle(ps)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(psc?: string)\n {\n this.styleManager.setPenStyleClasses(psc)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(t?: TTheme)\n {\n this.styleManager.setTheme(t)\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n const { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n switch (this.mode) {\n case ModeInteraction.Erasing:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(model => Object.assign(this.model, model))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n default:\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n break\n }\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n switch (this.mode) {\n case ModeInteraction.Erasing:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n default:\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n break\n }\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n switch (this.mode) {\n case ModeInteraction.Erasing:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n default:\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n break\n }\n }\n\n drawCurrentStroke(): void\n {\n this.renderer.drawPendingStroke(this.model.currentStroke)\n }\n\n async updateModelRendering(): Promise\n {\n this.renderer.drawModel(this.model)\n const deferred = new DeferredPromise()\n this.undoRedoManager.addModelToStack(this.model)\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n clearTimeout(this.#exportTimer)\n let currentModel = this.model.getClone()\n this.#exportTimer = setTimeout(async () =>\n {\n try {\n currentModel = await this.recognizer.export(currentModel)\n this.undoRedoManager.updateModelInStack(currentModel)\n if (this.model.modificationDate === currentModel.modificationDate) {\n this.model.exports = currentModel.exports\n }\n deferred.resolve(this.model)\n } catch (error) {\n deferred.reject(error as Error)\n }\n }, this.#configuration.triggers.exportContent === \"QUIET_PERIOD\" ? this.#configuration.triggers.exportContentDelay : 0)\n } else {\n deferred.resolve(this.model)\n }\n await deferred.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n return deferred.promise\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes)\n if (this.model.modificationDate === newModel.modificationDate) {\n this.model.mergeExport(newModel.exports as TExport)\n }\n this.undoRedoManager.updateModelInStack(newModel)\n return this.model\n }\n\n async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes)\n Object.assign(this.#model, newModel)\n return this.model\n }\n\n async resize(height: number, width: number): Promise\n {\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n this.renderer.resize(this.model)\n if (this.model.rawStrokes.length) {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n const resizeModel = await this.recognizer.resize(this.model)\n deferredResize.resolve(resizeModel)\n }, this.#configuration.triggers.resizeTriggerDelay)\n } else {\n deferredResize.resolve(this.model)\n }\n const newModel = await deferredResize.promise\n this.internalEvent.emitExported(newModel.exports as TExport)\n return newModel\n }\n\n async undo(): Promise\n {\n this.#model = this.undoRedoManager.undo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n return this.#model\n }\n\n async redo(): Promise\n {\n this.#model = this.undoRedoManager.redo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n return this.#model\n }\n\n async clear(): Promise\n {\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.drawModel(this.model)\n this.internalEvent.emitExported(this.model.exports as TExport)\n return this.model\n }\n\n async destroy(): Promise\n {\n this.grabber.detach()\n this.renderer.destroy()\n return Promise.resolve()\n }\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { computeHmac } from \"./CryptoHelper\"\nimport StyleHelper from \"../style/StyleHelper\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\n/**\n * A websocket dialog have this sequence :\n * --------------------------- Client --------------------------------------------------- Server ----------------------------------\n * init: send newContentPackage or restoreIInkSession ==================>\n * <================== hmacChallenge\n * answer hmacChallenge: send the hmac ==================>\n * <================== contentPackageDescription\n * answer contentPackageDescription:\n * send the configuration ==================>\n * send newContentPart or openContentPart ==================>\n * <================== partChanged\n * <================== contentChanged\n * <================== newPart\n * <================== svgPatch\n *\n * setPenStyle (send the parameters) ==================>\n * setTheme (send the parameters) ==================>\n * setPenStyleClasses (send the parameters) ==================>\n * <================== svgPatch\n * addStrokes (send the strokes ) ============>\n * <================== update\n */\nexport class WSRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n protected socket!: WebSocket\n protected pingCount = 0\n protected reconnectionCount = 0\n protected viewSizeHeight!: number\n protected viewSizeWidth!: number\n // contentPartCount = 0\n protected sessionId?: string\n protected currentPartId?: string\n protected currentErrorCode?: string | number\n\n protected penStyle?: TPenStyle\n protected penStyleClasses?: string\n protected theme?: TTheme\n\n protected connected?: DeferredPromise\n protected initialized?: DeferredPromise\n protected addStrokeDeferred?: DeferredPromise\n protected exportDeferred?: DeferredPromise\n protected convertDeferred?: DeferredPromise\n protected importDeferred?: DeferredPromise\n protected resizeDeferred?: DeferredPromise\n protected undoDeferred?: DeferredPromise\n protected redoDeferred?: DeferredPromise\n protected clearDeferred?: DeferredPromise\n protected importPointEventsDeferred?: DeferredPromise\n protected waitForIdleDeferred?: DeferredPromise\n\n url: string\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n const scheme = (this.serverConfiguration.scheme === \"https\") ? \"wss\" : \"ws\"\n this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }`\n }\n\n get mimeTypes(): string[]\n {\n switch (this.recognitionConfiguration.type.toLocaleLowerCase()) {\n case \"text\":\n return this.recognitionConfiguration.text.mimeTypes\n case \"math\":\n return this.recognitionConfiguration.math.mimeTypes\n case \"diagram\":\n return this.recognitionConfiguration.diagram.mimeTypes\n default:\n //\"raw-content\"\n return []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n protected infinitePing(): void\n {\n this.pingCount++\n if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) {\n this.socket.close(1000, \"PING_LOST\")\n } else if (this.socket.readyState <= 1) {\n setTimeout(() =>\n {\n if (this.socket.readyState <= 1) {\n this.socket.send(JSON.stringify({ type: \"ping\" }))\n this.infinitePing()\n }\n }, this.serverConfiguration.websocket.pingDelay)\n }\n }\n\n protected openCallback(): void\n {\n this.connected?.resolve()\n const params: TWebSocketEvent = {\n type: this.sessionId ? \"restoreIInkSession\" : \"newContentPackage\",\n iinkSessionId: this.sessionId,\n applicationKey: this.serverConfiguration.applicationKey,\n xDpi: 96,\n yDpi: 96,\n viewSizeHeight: this.viewSizeHeight,\n viewSizeWidth: this.viewSizeWidth\n }\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n params[\"myscript-client-name\"] = \"iink-ts\"\n params[\"myscript-client-version\"] = \"1.0.0-buildVersion\"\n }\n this.send(params)\n }\n\n protected rejectDeferredPending(error: Error): void\n {\n if (this.connected?.isPending) {\n this.connected?.reject(error)\n }\n if (this.initialized?.isPending) {\n this.initialized?.reject(error)\n }\n if (this.addStrokeDeferred?.isPending) {\n this.addStrokeDeferred?.reject(error)\n }\n if (this.exportDeferred?.isPending) {\n this.exportDeferred?.reject(error)\n }\n if (this.convertDeferred?.isPending) {\n this.convertDeferred?.reject(error)\n }\n if (this.importDeferred?.isPending) {\n this.importDeferred?.reject(error)\n }\n if (this.resizeDeferred?.isPending) {\n this.resizeDeferred?.reject(error)\n }\n if (this.undoDeferred?.isPending) {\n this.undoDeferred?.reject(error)\n }\n if (this.redoDeferred?.isPending) {\n this.redoDeferred?.reject(error)\n }\n if (this.clearDeferred?.isPending) {\n this.clearDeferred.reject(error)\n }\n if (this.waitForIdleDeferred?.isPending) {\n this.waitForIdleDeferred.reject(error)\n }\n }\n\n protected closeCallback(evt: CloseEvent): void\n {\n let message = \"\"\n if (!this.currentErrorCode) {\n switch (evt.code) {\n case 1000:\n // Normal Closure\n break\n case 1001:\n message = ErrorConst.GOING_AWAY\n break\n case 1002:\n message = ErrorConst.PROTOCOL_ERROR\n break\n case 1003:\n message = ErrorConst.UNSUPPORTED_DATA\n break\n case 1006:\n message = ErrorConst.ABNORMAL_CLOSURE\n break\n case 1007:\n message = ErrorConst.INVALID_FRAME_PAULOAD\n break\n case 1008:\n message = ErrorConst.POLICY_VIOLATION\n break\n case 1009:\n message = ErrorConst.MESSAGE_TOO_BIG\n break\n case 1011:\n message = ErrorConst.INTERNAL_ERROR\n break\n case 1012:\n message = ErrorConst.SERVICE_RESTART\n break\n case 1013:\n message = ErrorConst.TRY_AGAIN\n break\n case 1014:\n message = ErrorConst.BAD_GATEWAY\n break\n case 1015:\n message = ErrorConst.TLS_HANDSHAKE\n break\n default:\n message = ErrorConst.CANT_ESTABLISH\n break\n }\n }\n const error = new Error(message || evt.reason)\n\n this.rejectDeferredPending(error)\n\n if (!this.currentErrorCode && evt.code !== 1000) {\n this.internalEvent.emitError(error)\n }\n }\n\n protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void\n {\n const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent\n if (hmacChallengeMessage.hmacChallenge) {\n this.send({\n type: \"hmac\",\n hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)\n })\n }\n if (hmacChallengeMessage.iinkSessionId) {\n this.sessionId = hmacChallengeMessage.iinkSessionId\n }\n }\n\n protected manageContentPackageDescriptionMessage(): void\n {\n this.reconnectionCount = 0\n\n this.send({ ...this.recognitionConfiguration, type: \"configuration\" })\n\n if (this.currentPartId) {\n this.send({ type: \"openContentPart\", id: this.currentPartId, mimeTypes: this.mimeTypes })\n }\n else {\n this.send({ type: \"newContentPart\", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes })\n }\n }\n\n protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent\n this.currentPartId = partChangeMessage.partId\n this.initialized?.resolve()\n }\n\n protected manageExportMessage(websocketMessage: TWebSocketEvent): void\n {\n const exportMessage = websocketMessage as TWebSocketExportEvent\n if (exportMessage.exports[\"application/vnd.myscript.jiix\"]) {\n exportMessage.exports[\"application/vnd.myscript.jiix\"] = JSON.parse(exportMessage.exports[\"application/vnd.myscript.jiix\"].toString()) as TJIIXExport\n }\n this.initialized?.resolve()\n this.addStrokeDeferred?.resolve(exportMessage.exports)\n this.exportDeferred?.resolve(exportMessage.exports)\n this.convertDeferred?.resolve(exportMessage.exports)\n this.importDeferred?.resolve(exportMessage.exports)\n this.undoDeferred?.resolve(exportMessage.exports)\n this.redoDeferred?.resolve(exportMessage.exports)\n this.clearDeferred?.resolve(exportMessage.exports)\n this.importPointEventsDeferred?.resolve(exportMessage.exports)\n this.internalEvent.emitExported(exportMessage.exports)\n }\n\n protected async manageWaitForIdle(): Promise {\n this.internalEvent.emitIdle(true)\n this.waitForIdleDeferred?.resolve()\n }\n\n protected manageErrorMessage(websocketMessage: TWebSocketEvent): void\n {\n const err = websocketMessage as TWebSocketErrorEvent\n this.currentErrorCode = err.data?.code || err.code\n let message = err.data?.message || err.message || ErrorConst.UNKNOW\n\n switch (this.currentErrorCode) {\n case \"no.activity\":\n message = ErrorConst.NO_ACTIVITY\n break\n case \"access.not.granted\":\n message = ErrorConst.WRONG_CREDENTIALS\n break\n case \"session.too.old\":\n message = ErrorConst.TOO_OLD\n break\n }\n const error = new Error(message)\n this.rejectDeferredPending(error)\n this.internalEvent.emitError(error)\n }\n\n protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent\n const context: TUndoRedoContext = {\n canRedo: contentChangeMessage.canRedo,\n canUndo: contentChangeMessage.canUndo,\n empty: contentChangeMessage.empty,\n stackIndex: contentChangeMessage.undoStackIndex,\n possibleUndoCount: contentChangeMessage.possibleUndoCount,\n stack: []\n }\n this.internalEvent.emitContextChange(context)\n }\n\n protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void\n {\n this.resizeDeferred?.resolve()\n const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent\n this.internalEvent.emitSVGPatch(svgPatchMessage)\n }\n\n protected messageCallback(message: MessageEvent): void\n {\n this.currentErrorCode = undefined\n const websocketMessage: TWebSocketEvent = JSON.parse(message.data)\n if (websocketMessage.type !== \"pong\") {\n this.pingCount = 0\n switch (websocketMessage.type) {\n case \"ack\":\n this.manageHMACChallengeMessage(websocketMessage)\n break\n case \"contentPackageDescription\":\n this.manageContentPackageDescriptionMessage()\n break\n case \"partChanged\":\n this.managePartChangeMessage(websocketMessage)\n break\n case \"newPart\":\n this.initialized?.resolve()\n break\n case \"contentChanged\":\n this.manageContentChangeMessage(websocketMessage)\n break\n case \"exported\":\n this.manageExportMessage(websocketMessage)\n break\n case \"svgPatch\":\n this.manageSVGPatchMessage(websocketMessage)\n break\n case \"error\":\n this.manageErrorMessage(websocketMessage)\n break\n case \"idle\":\n this.manageWaitForIdle()\n break\n // case \"supportedImportMimeTypes\":\n // recognizerContext.supportedImportMimeTypes = message.data.mimeTypes\n // recognitionContext.response(undefined, message.data)\n // break\n // case \"fileChunkAck\":\n // this.importDeferred?.resolve((websocketMessage as unknown) as TExport)\n // break\n // case \"idle\":\n // recognizerContext.idle = true\n // recognitionContext.patch(undefined, message.data)\n // break\n // default :\n // logger.warn(\"This is something unexpected in current recognizer. Not the type of message we should have here.\", message)\n }\n }\n }\n\n async init(height: number, width: number): Promise\n {\n try {\n this.destroy()\n this.connected = new DeferredPromise()\n this.initialized = new DeferredPromise()\n this.viewSizeHeight = height\n this.viewSizeWidth = width\n this.pingCount = 0\n this.socket = new WebSocket(this.url)\n\n if (this.serverConfiguration.websocket.pingEnabled) {\n this.infinitePing()\n }\n\n this.socket.addEventListener(\"open\", this.openCallback.bind(this))\n this.socket.addEventListener(\"close\", this.closeCallback.bind(this))\n this.socket.addEventListener(\"message\", this.messageCallback.bind(this))\n\n return this.initialized.promise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n const error = new Error(ErrorConst.CANT_ESTABLISH)\n this.internalEvent.emitError(error)\n this.initialized?.reject(error)\n return this.initialized?.promise\n }\n }\n\n async send(message: TWebSocketEvent): Promise\n {\n if (!this.connected) {\n return Promise.reject(new Error(\"Recognizer must be initilized\"))\n }\n await this.connected.promise\n if (this.socket.readyState === this.socket.OPEN) {\n this.socket.send(JSON.stringify(message))\n return Promise.resolve()\n } else {\n if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) {\n this.reconnectionCount++\n if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) {\n this.internalEvent.emitClearMessage()\n await this.init(this.viewSizeHeight, this.viewSizeWidth)\n this.setPenStyle(this.penStyle as TPenStyle)\n this.setPenStyleClasses(this.penStyleClasses as string)\n this.setTheme(this.theme as TTheme)\n return this.send(message)\n }\n else {\n return Promise.reject(new Error(\"Unable to send message. The maximum number of connection attempts has been reached.\"))\n }\n }\n }\n }\n\n async addStrokes(model: IModel): Promise\n {\n await this.initialized?.promise\n this.addStrokeDeferred = new DeferredPromise()\n const strokes: TStroke[] = model.extractUnsentStrokes()\n model.updatePositionSent()\n const localModel = model.getClone()\n if (strokes.length === 0) {\n this.addStrokeDeferred.resolve({} as TExport)\n return localModel\n }\n await this.send({\n type: \"addStrokes\",\n strokes: strokes.map(convertStrokeToJSON)\n })\n const exports = await this.addStrokeDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n return localModel\n }\n\n async setPenStyle(penStyle: TPenStyle): Promise\n {\n await this.initialized?.promise\n this.penStyle = penStyle\n const message: TWebSocketEvent = {\n type: \"setPenStyle\",\n style: StyleHelper.penStyleToCSS(penStyle)\n }\n return this.send(message)\n }\n\n async setPenStyleClasses(penStyleClasses: string): Promise\n {\n await this.initialized?.promise\n this.penStyleClasses = penStyleClasses\n const message: TWebSocketEvent = {\n type: \"setPenStyleClasses\",\n styleClasses: penStyleClasses\n }\n return this.send(message)\n }\n\n async setTheme(theme: TTheme): Promise\n {\n await this.initialized?.promise\n this.theme = theme\n const message: TWebSocketEvent = {\n type: \"setTheme\",\n theme: StyleHelper.themeToCSS(theme)\n }\n return this.send(message)\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n await this.initialized?.promise\n this.exportDeferred = new DeferredPromise()\n const localModel = model.getClone()\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n }\n }\n\n if (!mimeTypes.length) {\n return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`))\n }\n\n const message: TWebSocketEvent = {\n type: \"export\",\n partId: this.currentPartId,\n mimeTypes\n }\n await this.send(message)\n const exports: TExport = await this.exportDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n return localModel\n }\n\n async import(model: IModel, data: Blob, mimeType?: string): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n const chunkSize = this.serverConfiguration.websocket.fileChunkSize\n const importFileId = Math.random().toString(10).substring(2, 6)\n this.importDeferred = new DeferredPromise()\n const readBlob = (blob: Blob): Promise =>\n {\n const fileReader = new FileReader()\n return new Promise((resolve, reject) =>\n {\n fileReader.onloadend = (ev) => resolve(ev.target?.result as string)\n fileReader.onerror = () => reject()\n fileReader.readAsText(blob)\n })\n }\n\n const importFileMessage: TWebSocketEvent = {\n type: \"importFile\",\n importFileId,\n mimeType\n }\n await this.send(importFileMessage)\n for (let i = 0; i < data.size; i += chunkSize) {\n const blobPart = data.slice(i, i + chunkSize, data.type)\n const partFileString = await readBlob(blobPart)\n const fileChuckMessage: TWebSocketEvent = {\n type: \"fileChunk\",\n importFileId,\n data: partFileString,\n lastChunk: i + chunkSize > data.size\n }\n await this.send(fileChuckMessage)\n }\n const exports = await this.importDeferred?.promise\n this.importDeferred = undefined\n localModel.mergeExport(exports)\n return localModel\n }\n\n async resize(model: IModel): Promise\n {\n await this.initialized?.promise\n this.resizeDeferred = new DeferredPromise()\n const localModel = model.getClone()\n this.viewSizeHeight = localModel.height\n this.viewSizeWidth = localModel.width\n const message: TWebSocketEvent = {\n type: \"changeViewSize\",\n height: this.viewSizeHeight,\n width: this.viewSizeWidth,\n }\n await this.send(message)\n await this.resizeDeferred?.promise\n return localModel\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n await this.initialized?.promise\n this.importPointEventsDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"pointerEvents\",\n events: strokes.map(convertStrokeToJSON)\n }\n this.send(message)\n\n const exportPoints = await this.importPointEventsDeferred?.promise\n this.importPointEventsDeferred = undefined\n return exportPoints as TExport\n }\n\n async convert(model: IModel, conversionState?: TConverstionState): Promise\n {\n await this.initialized?.promise\n this.convertDeferred = new DeferredPromise()\n const localModel = model.getClone()\n const message: TWebSocketEvent = {\n type: \"convert\",\n conversionState\n }\n await this.send(message)\n const myExportConverted: TExport = await this.convertDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeConvert(myExportConverted)\n localModel.mergeExport(myExportConverted)\n return localModel\n }\n\n async waitForIdle(): Promise\n {\n await this.initialized?.promise\n this.waitForIdleDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"waitForIdle\",\n }\n await this.send(message)\n return this.waitForIdleDeferred?.promise\n }\n\n async undo(model: IModel): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n this.undoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"undo\",\n }\n await this.send(message)\n const undoExports = await this.undoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(undoExports)\n this.undoDeferred = undefined\n return localModel\n }\n\n async redo(model: IModel): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n this.redoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"redo\",\n }\n await this.send(message)\n const redoExports = await this.redoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(redoExports)\n this.redoDeferred = undefined\n return localModel\n }\n\n async clear(model: IModel): Promise\n {\n await this.initialized?.promise\n const localModel = model.getClone()\n localModel.modificationDate = Date.now()\n this.clearDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"clear\",\n }\n await this.send(message)\n const clearExports = await this.clearDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(clearExports)\n this.clearDeferred = undefined\n return localModel\n }\n\n close(code: number, reason: string): void\n {\n if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.socket.close(code, reason)\n }\n }\n\n destroy(): void\n {\n this.connected = undefined\n this.initialized = undefined\n this.addStrokeDeferred = undefined\n this.exportDeferred = undefined\n this.convertDeferred = undefined\n this.importDeferred = undefined\n this.resizeDeferred = undefined\n this.undoDeferred = undefined\n this.redoDeferred = undefined\n this.clearDeferred = undefined\n if (this.socket) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.close(1000, \"Recognizer destroyed\")\n }\n }\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class SVGStroker\n{\n\n private getArcPath(center: TPointer, radius: number): string\n {\n const svgPath = [\n `M ${ center.x },${ center.y }`,\n `m ${ -radius },0`,\n `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`,\n `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0`\n ].join(\" \")\n return svgPath\n }\n\n private getLinePath(begin: TPointer, end: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `L ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private getFinalPath(begin: TPointer, end: TPointer, width: number): string\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`]\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - (i * (Math.PI / ARCSPLIT))\n parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`)\n }\n const svgPath = parts.join(\" \")\n return svgPath\n }\n\n private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width)\n const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private buildSVGPath(stroke: TStroke): string\n {\n const STROKE_LENGTH = stroke.pointers.length\n const STROKE_WIDTH = (stroke.style.width as number)\n const NB_QUADRATICS = STROKE_LENGTH - 2\n const firstPoint = stroke.pointers[0]\n\n const parts = []\n if (STROKE_LENGTH < 3) {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6))\n } else {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p))\n parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH))\n\n for (let i = 0; i < NB_QUADRATICS; i++) {\n const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const central = stroke.pointers[i + 1]\n parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH)\n )\n }\n const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2]\n const lastPoint = stroke.pointers[STROKE_LENGTH - 1]\n parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH))\n parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH))\n }\n return parts.join(\" \")\n }\n\n drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void\n {\n const svgPathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n svgPathElement.classList.add(\"pending-stroke\")\n svgPathElement.setAttribute(\"id\", stroke.id)\n svgPathElement.setAttribute(\"type\", \"stroke\")\n attrs?.forEach(a =>\n {\n svgPathElement.setAttribute(a.name, a.value)\n })\n const svgPath = this.buildSVGPath(stroke)\n svgPathElement.setAttribute(\"d\", `${ svgPath }Z`)\n svgElement.appendChild(svgPathElement)\n }\n}\n","import { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from \"../../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { SVGStroker } from \"./SVGStroker\"\n\nexport class WSSVGRenderer\n{\n config: TRenderingConfiguration\n stroker: SVGStroker\n context!: {\n parent: HTMLElement\n }\n\n constructor(config: TRenderingConfiguration)\n {\n this.config = config\n this.stroker = new SVGStroker()\n }\n\n init(element: HTMLElement): void\n {\n element.style.fontSize = \"10px\"\n this.context = {\n parent: element\n }\n }\n\n #drawStroke(svgElement: SVGElement, stroke: TStroke)\n {\n let style: string\n if (stroke.pointerType === \"eraser\") {\n stroke.style.width = 20\n style = \"fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;\"\n } else {\n style = `fill:${ stroke.style.color };stroke:transparent;`\n }\n this.stroker.drawStroke(svgElement, stroke, [{ name: \"style\", value: style }])\n }\n\n #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void\n {\n const oldLayer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement | null\n oldLayer?.remove()\n this.context.parent.insertAdjacentHTML(\"beforeend\", update.svg)\n const layer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement\n if (layerName === \"MODEL\") {\n const pendingStrokesGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n pendingStrokesGroup.id = \"pendingStrokes\"\n layer.appendChild(pendingStrokesGroup)\n }\n }\n\n #replaceElement(update: TUpdatePatchReplaceELement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null\n if (elementToRemove) {\n const parent = elementToRemove.parentNode as HTMLElement | null | undefined\n elementToRemove?.remove()\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n }\n\n #appendChild(layerName: string, update: TUpdatePatchAppendChild): void\n {\n const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer=\"${ layerName }\"]`\n const parent = this.context.parent.querySelector(parentSelector) as HTMLElement\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n\n #removeChild(update: TUpdatePatchRemoveChild): void\n {\n this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove()\n }\n\n #removeElement(update: TUpdatePatchRemoveElement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`)\n if (elementToRemove) {\n if (update.id.includes(\"s\") || update.id.includes(\"MODEL\")) {\n elementToRemove.remove()\n } else {\n elementToRemove.setAttribute(\"class\", \"removed-stroke\")\n setTimeout(() =>\n {\n elementToRemove?.remove()\n }, 100)\n }\n }\n }\n\n #insertBefore(update: TUpdatePatchInsertBefore): void\n {\n const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null\n parent?.insertAdjacentHTML(\"beforebegin\", update.svg)\n }\n\n #setAttribute(update: TUpdatePatchSetAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.setAttribute(update.name, update.value)\n }\n\n #removeAttribute(update: TUpdatePatchRemoveAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.removeAttribute(update.name)\n }\n\n updateLayer(layerName: string, update: TUpdatePatch): void\n {\n switch (update.type) {\n case \"REPLACE_ALL\":\n this.#replaceAll(layerName, update as TUpdatePatchReplaceAll)\n break\n case \"REPLACE_ELEMENT\":\n this.#replaceElement(update as TUpdatePatchReplaceELement)\n break\n case \"APPEND_CHILD\":\n this.#appendChild(layerName, update as TUpdatePatchAppendChild)\n break\n case \"REMOVE_ELEMENT\":\n this.#removeElement(update as TUpdatePatchRemoveElement)\n break\n case \"REMOVE_CHILD\":\n this.#removeChild(update as TUpdatePatchRemoveChild)\n break\n case \"INSERT_BEFORE\":\n this.#insertBefore(update as TUpdatePatchInsertBefore)\n break\n case \"SET_ATTRIBUTE\":\n this.#setAttribute(update as TUpdatePatchSetAttribut)\n break\n case \"REMOVE_ATTRIBUTE\":\n this.#removeAttribute(update as TUpdatePatchRemoveAttribut)\n break\n default:\n break\n }\n }\n\n updatesLayer(layerName: string, updates: TUpdatePatch[]): void\n {\n updates.forEach(u => this.updateLayer(layerName, u))\n this.clearPendingStroke()\n }\n\n clearPendingStroke(): void\n {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n pendingStrokeGroup.innerHTML = \"\"\n }\n }\n\n drawPendingStroke(stroke: TStroke): void\n {\n if (stroke) {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`)\n if (oldStroke) {\n oldStroke.remove()\n }\n this.#drawStroke(pendingStrokeGroup, stroke)\n }\n }\n }\n\n resize(model: IModel): void\n {\n const rect = this.context.parent.getBoundingClientRect()\n const svgList = this.context.parent.querySelectorAll(\"svg\")\n const width = Math.max(rect.width, model.width)\n const height = Math.max(rect.height, model.height)\n svgList.forEach(svg =>\n {\n svg.setAttribute(\"viewBox\", `0 0 ${ width }, ${ height }`)\n svg.setAttribute(\"width\", `${ width }px`)\n svg.setAttribute(\"height\", `${ height }px`)\n })\n }\n\n destroy(): void\n {\n if (this.context.parent) {\n this.context.parent.querySelectorAll(\"svg\").forEach(n => n.remove())\n }\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { TConfiguration } from \"../@types/Configuration\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { WSRecognizer } from \"../recognizer/WSRecognizer\"\nimport { ModeInteraction, WSMessage } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { WSSVGRenderer } from \"../renderer/svg/WSSVGRenderer\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\n\nexport class WSBehaviors implements IBehaviors\n{\n name = \"WSBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: WSSVGRenderer\n recognizer: WSRecognizer\n context: TUndoRedoContext\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n mode: ModeInteraction\n\n #resizeTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new WSSVGRenderer(this.#configuration.rendering)\n this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.mode = ModeInteraction.Writing\n this.#model = new Model()\n this.context = {\n canRedo: false,\n canUndo: false,\n empty: true,\n stackIndex: -1,\n possibleUndoCount: 0,\n stack: []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(ps?: TPenStyle): Promise\n {\n this.styleManager.setPenStyle(ps)\n return this.recognizer.setPenStyle(this.styleManager.penStyle)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(psc?: string): Promise\n {\n this.styleManager.setPenStyleClasses(psc)\n return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(t: TTheme): Promise\n {\n this.styleManager.setTheme(t)\n return this.recognizer.setTheme(this.styleManager.theme)\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.#model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.context.stack.push(this.model.getClone())\n this.context.stackIndex = 0\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n\n this.internalEvent.addSVGPatchListener(this.onSVGPatch)\n this.internalEvent.addContextChangeListener(this.onContextChange)\n\n await this.recognizer.init(this.#model.height, this.#model.width)\n await this.setPenStyle(this.penStyle)\n await this.setTheme(this.theme)\n await this.setPenStyleClasses(this.penStyleClasses)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n let { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n if (this.mode === ModeInteraction.Erasing) {\n pointerType = \"eraser\"\n }\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n\n private onSVGPatch = (evt: TWebSocketSVGPatchEvent) =>\n {\n this.renderer.updatesLayer(evt.layer, evt.updates)\n }\n\n private onContextChange = (context: TUndoRedoContext) =>\n {\n this.context.canRedo = context.canRedo\n this.context.canUndo = context.canUndo\n this.context.empty = context.empty\n this.context.possibleUndoCount = context.possibleUndoCount\n this.context.stackIndex = context.stackIndex\n }\n\n drawCurrentStroke(): void\n {\n const currentStroke = this.model.currentStroke as TStroke\n if (currentStroke) {\n this.renderer.drawPendingStroke(currentStroke)\n }\n }\n\n async updateModelRendering(): Promise\n {\n this.context.stack.push(this.model.getClone())\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n const updatedModel = await this.recognizer.addStrokes(this.model)\n this.model.mergeExport(updatedModel.exports as TExport)\n }\n return this.model\n }\n\n async waitForIdle?(): Promise\n {\n return this.recognizer.waitForIdle()\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n const exportPoints = await this.recognizer.importPointEvents(strokes)\n this.model.mergeExport(exportPoints)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n try {\n if (this.#configuration.triggers.exportContent === \"DEMAND\") {\n return this.recognizer.addStrokes(this.model)\n } else {\n return this.recognizer.export(this.model, mimeTypes)\n }\n } catch (error) {\n this.internalEvent.emitError(error as Error)\n return Promise.reject(error)\n }\n }\n\n async convert(conversionState?: TConverstionState): Promise\n {\n this.context.stack.push(this.model.getClone())\n this.#model = await this.recognizer.convert(this.model, conversionState)\n return this.model\n }\n\n async import(data: Blob, mimeType?: string): Promise\n {\n this.context.stack.push(this.model.getClone())\n return this.recognizer.import(this.model, data, mimeType)\n }\n\n async resize(height: number, width: number): Promise\n {\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n const clonedModel = this.model.getClone()\n this.renderer.resize(clonedModel)\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n try {\n const resizeModel = await this.recognizer.resize(clonedModel)\n deferredResize.resolve(resizeModel)\n } catch (error) {\n deferredResize.reject(error as Error)\n }\n }, this.#configuration.triggers.resizeTriggerDelay)\n\n this.#model = await deferredResize.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n return this.model\n }\n\n async undo(): Promise\n {\n if (this.context.canUndo) {\n this.#model = this.context.stack[this.context.stackIndex - 1]\n return this.recognizer.undo(this.#model)\n }\n else {\n throw new Error(\"Undo not allowed\")\n }\n }\n\n async redo(): Promise\n {\n if (this.context.canRedo) {\n this.#model = this.context.stack[this.context.stackIndex + 1]\n return this.recognizer.redo(this.#model)\n }\n else {\n throw new Error(\"Redo not allowed\")\n }\n }\n\n async clear(): Promise\n {\n this.model.clear()\n this.context.stack.push(this.model.getClone())\n return this.recognizer.clear(this.model)\n }\n\n async destroy(): Promise\n {\n this.grabber.detach()\n this.renderer.destroy()\n this.recognizer.close(1000, WSMessage.CLOSE_RECOGNIZER)\n return Promise.resolve()\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { TConfiguration } from \"./@types/Configuration\"\nimport { IGrabber } from \"./@types/grabber/Grabber\"\nimport { TStroke } from \"./@types/model/Stroke\"\nimport { IModel, TExport, TJIIXExport } from \"./@types/model/Model\"\nimport { TPenStyle } from \"./@types/style/PenStyle\"\nimport { TTheme } from \"./@types/style/Theme\"\nimport { IBehaviors, TBehaviorOptions } from \"./@types/Behaviors\"\nimport { TConverstionState } from \"./@types/configuration/RecognitionConfiguration\"\nimport { TMarginConfiguration } from \"./@types/configuration/recognition/MarginConfiguration\"\nimport { TUndoRedoContext } from \"./@types/undo-redo/UndoRedoContext\"\n\nimport { Exports, ModeInteraction } from \"./Constants\"\nimport { PublicEvent } from \"./event/PublicEvent\"\nimport { InternalEvent } from \"./event/InternalEvent\"\nimport { SmartGuide } from \"./smartguide/SmartGuide\"\nimport { DeferredPromise } from \"./utils/DeferredPromise\"\nimport { RestBehaviors } from \"./behaviors/RestBehaviors\"\nimport { WSBehaviors } from \"./behaviors/WSBehaviors\"\n\nimport \"./iink.css\"\n\nexport type HTMLEditorElement = HTMLElement &\n{\n editor: Editor\n}\n\nexport class Editor\n{\n wrapperHTML: HTMLEditorElement\n #loaderHTML: HTMLDivElement\n #messageHTML: HTMLDivElement\n #behaviors!: IBehaviors\n #smartGuide?: SmartGuide\n #initializationDeferred: DeferredPromise\n\n debug = false\n\n constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = \"ms-editor\")\n {\n this.#initializationDeferred = new DeferredPromise()\n\n this.wrapperHTML = wrapperHTML as HTMLEditorElement\n this.wrapperHTML.classList.add(globalClassCss)\n this.events.setElement(this.wrapperHTML)\n\n this.#loaderHTML = document.createElement(\"div\")\n this.#loaderHTML.classList.add(\"loader\")\n this.#loaderHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#loaderHTML)\n\n this.#messageHTML = document.createElement(\"div\")\n this.#messageHTML.classList.add(\"message\")\n this.#messageHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#messageHTML)\n\n this.#instantiateBehaviors(options)\n this.#addListeners()\n }\n\n get initializationPromise(): Promise\n {\n return this.#initializationDeferred.promise\n }\n\n get model(): IModel\n {\n return this.behaviors.model\n }\n\n get behaviors(): IBehaviors\n {\n return this.#behaviors\n }\n\n get configuration(): TConfiguration\n {\n return this.behaviors.configuration\n }\n set configuration(configuration: TConfiguration)\n {\n this.#instantiateBehaviors({ configuration })\n this.initialize()\n }\n\n get mode(): ModeInteraction\n {\n return this.behaviors.mode\n }\n set mode(m: ModeInteraction)\n {\n this.behaviors.mode = m\n switch (this.behaviors.mode) {\n case ModeInteraction.Erasing:\n this.wrapperHTML.classList.add(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n // case ModeInteraction.Selecting:\n // this.model.resetSelectedStrokes()\n // this.wrapperHTML.classList.remove(\"erasing\")\n // this.wrapperHTML.classList.add(\"selecting\")\n // break;\n default:\n document.body.style.cursor = \"initial\"\n this.wrapperHTML.classList.remove(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n }\n }\n\n get events(): PublicEvent\n {\n return PublicEvent.getInstance()\n }\n\n get context(): TUndoRedoContext\n {\n return this.behaviors.context\n }\n\n get grabber(): IGrabber\n {\n return this.behaviors.grabber\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.behaviors.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.behaviors.penStyle\n }\n set penStyle(ps: TPenStyle)\n {\n this.behaviors.setPenStyle(ps)\n }\n\n get theme(): TTheme\n {\n return this.behaviors.theme\n }\n set theme(t: TTheme)\n {\n this.behaviors.setTheme(t)\n }\n\n get penStyleClasses(): string\n {\n return this.behaviors.penStyleClasses\n }\n set penStyleClasses(psc: string)\n {\n this.behaviors.setPenStyleClasses(psc)\n }\n\n #instantiateBehaviors(options: TBehaviorOptions)\n {\n if (!options?.configuration) {\n throw new Error(\"Configuration required\")\n }\n if (this.#behaviors) {\n this.#behaviors.destroy()\n }\n let defaultBehaviors: IBehaviors\n if (options.configuration.server?.protocol === \"REST\") {\n defaultBehaviors = new RestBehaviors(options)\n } else {\n defaultBehaviors = new WSBehaviors(options)\n }\n this.#behaviors = Object.assign(defaultBehaviors, options.behaviors)\n }\n\n #initializeBehaviors(): Promise\n {\n this.#initializationDeferred = new DeferredPromise()\n this.#loaderHTML.style.display = \"initial\"\n this.#cleanMessage()\n return this.behaviors.init(this.wrapperHTML)\n .then(async () =>\n {\n this.wrapperHTML.editor = this\n this.#initializationDeferred.resolve()\n this.events.emitLoaded()\n })\n .catch((e: Error) =>\n {\n this.#initializationDeferred.reject(e)\n this.#showError(e)\n })\n .finally(() =>\n {\n this.#loaderHTML.style.display = \"none\"\n return this.#initializationDeferred.promise\n })\n }\n\n #initializeSmartGuide(): void\n {\n this.#smartGuide?.destroy()\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide = new SmartGuide()\n let margin: TMarginConfiguration\n switch (this.configuration.recognition.type) {\n case \"TEXT\":\n margin = this.configuration.recognition.text.margin\n break\n case \"MATH\":\n margin = this.configuration.recognition.math.margin\n break\n default:\n margin = {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n }\n break\n }\n this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering)\n }\n }\n\n #cleanMessage()\n {\n this.#messageHTML.style.display = \"none\"\n this.#messageHTML.innerHTML = \"\"\n }\n\n #showError(err: Error)\n {\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"error-msg\")\n this.#messageHTML.classList.remove(\"info-msg\")\n this.#messageHTML.innerText = err.message\n if (this.debug) {\n const pName = document.createElement(\"p\")\n pName.innerHTML = err.name\n this.#messageHTML.prepend(pName)\n\n const pStack = document.createElement(\"p\")\n pStack.style.width = \"50vw\"\n pStack.style.marginLeft = \"calc(-25vw + 100px)\"\n pStack.innerHTML = err.stack || \"\"\n this.#messageHTML.appendChild(pStack)\n }\n }\n\n #showNotif(notif: { message: string, timeout?: number })\n {\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"info-msg\")\n this.#messageHTML.classList.remove(\"error-msg\")\n this.#messageHTML.innerText = notif.message\n setTimeout(() =>\n {\n this.#cleanMessage()\n }, notif.timeout || 2500)\n }\n\n #showStrokesIfDebug(): void\n {\n if (this.debug) {\n let panel = document.getElementById(\"stroke-panel\")\n const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers })))\n if (!panel) {\n panel = document.createElement(\"div\")\n panel.id = \"stroke-panel\"\n panel.addEventListener(\"click\", () =>\n {\n navigator.clipboard.writeText(panel?.innerText as string)\n this.#showNotif({ message: \"strokes copied to clipboard!\", timeout: 1500 })\n })\n this.wrapperHTML.appendChild(panel)\n }\n panel.innerText = text\n }\n }\n\n #addListeners(): void\n {\n InternalEvent.getInstance().addConvertListener(this.convert.bind(this))\n InternalEvent.getInstance().addClearListener(this.clear.bind(this))\n InternalEvent.getInstance().addErrorListener(this.#showError.bind(this))\n InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this))\n InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this))\n InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this))\n InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this))\n InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this))\n InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this))\n }\n\n #onContextChange = (context: TUndoRedoContext) =>\n {\n this.events.emitChanged(context)\n }\n\n #onIdleChange = (idle: boolean) =>\n {\n this.events.emitIdle(idle)\n }\n\n #onExport(exports: TExport): void\n {\n this.model.mergeExport(exports)\n if (this.configuration.rendering.smartGuide.enable) {\n if (exports && exports[\"application/vnd.myscript.jiix\"]) {\n const jjix = exports[\"application/vnd.myscript.jiix\"] as TJIIXExport\n this.#smartGuide?.update(jjix)\n }\n }\n this.#showStrokesIfDebug()\n this.events.emitExported(exports)\n }\n\n #onImportJIIX(jiix: TJIIXExport): void\n {\n this.import(new Blob([JSON.stringify(jiix)], { type: Exports.JIIX }), Exports.JIIX)\n }\n\n async initialize(): Promise\n {\n await this.#initializeBehaviors()\n this.#initializeSmartGuide()\n }\n\n async waitForIdle(): Promise\n {\n if (this.behaviors.waitForIdle)\n {\n return this.behaviors.waitForIdle()\n }\n return\n }\n\n async undo(): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.undo()\n this.#showStrokesIfDebug()\n return this.model\n }\n\n async redo(): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.redo()\n this.#showStrokesIfDebug()\n return this.model\n }\n\n async clear(): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.clear()\n this.events.emitCleared(this.model)\n this.#showStrokesIfDebug()\n return this.model\n }\n\n async resize(): Promise\n {\n await this.#initializationDeferred.promise\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide?.resize()\n }\n const height = Math.max(this.wrapperHTML.clientHeight, this.configuration.rendering.minHeight)\n const width = Math.max(this.wrapperHTML.clientWidth, this.configuration.rendering.minWidth)\n await this.behaviors.resize(height, width)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.export(mimeTypes)\n return this.model\n }\n\n async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise\n {\n await this.#initializationDeferred.promise\n await this.behaviors.convert(params?.conversionState, params?.mimeTypes)\n this.events.emitConverted(this.model.converts as TExport)\n return this.model\n }\n\n async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise\n {\n await this.#initializationDeferred.promise\n if (this.behaviors.import) {\n let blobToImport: Blob\n if (data instanceof Blob) {\n blobToImport = data\n }\n else if (typeof data === \"string\") {\n blobToImport = new Blob([data])\n }\n else {\n blobToImport = new Blob([JSON.stringify(data)])\n }\n await this.behaviors.import(blobToImport, mimeType)\n this.events.emitImported(this.model.exports as TExport)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no import function\")\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n await this.#initializationDeferred.promise\n if (this.behaviors.importPointEvents) {\n await this.behaviors.importPointEvents(strokes)\n this.events.emitImported(this.model.exports as TExport)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no importPointEvents function\")\n }\n\n}\n","import { TConfigurationClient } from \"../@types/Configuration\"\n\nexport async function getAvailableFontList(configuration: TConfigurationClient): Promise>\n{\n if (!configuration?.server?.scheme && !configuration?.server?.host) {\n return Promise.reject(\"Failed to get fonts: configuration.server.scheme & configuration.server.host are required!\")\n }\n if (!configuration?.recognition?.lang) {\n return Promise.reject(\"Failed to get fonts: configuration.recognition.lang is required!\")\n }\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang)\n const { result } = await response.json()\n return result.sort()\n}\n","import { TConfigurationClient } from \"../@types/Configuration\"\n\nexport async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>\n{\n if (configuration?.server?.scheme && configuration?.server?.host) {\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`)\n return response.json()\n } else {\n return Promise.reject(\"Failed to get languages: configuration.server.scheme & configuration.server.host are required!\")\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","get","__classPrivateFieldSet","set","Error","NO_ACTIVITY","WRONG_CREDENTIALS","TOO_OLD","UNKNOW","ABNORMAL_CLOSURE","CANT_ESTABLISH","GOING_AWAY","PROTOCOL_ERROR","UNSUPPORTED_DATA","INVALID_FRAME_PAULOAD","POLICY_VIOLATION","MESSAGE_TOO_BIG","INTERNAL_ERROR","SERVICE_RESTART","TRY_AGAIN","BAD_GATEWAY","TLS_HANDSHAKE","EventType","CHANGED","CLEARED","CONVERTED","ERROR","POINTEREVENTS","EXPORTED","IMPORTED","IDLE","LOADED","InternalEventType","SVG_PATCH","CLEAR_MESSAGE","NOTIF","IMPORT_JIIX","CONVERT","CLEAR","CONTEXT_CHANGE","WS_CLOSED","WSMessage","CLOSE_RECOGNIZER","Exports","JIIX","TEXT","LATEX","MATHML","SVG","OFFICE_DOCUMENT","ModeInteraction","exports","Constants","PublicEvent","EventTarget","constructor","super","_PublicEvent_element","this","static","_a","_PublicEvent_instance","setElement","el","emitLoaded","emitExported","_PublicEvent_instances","_PublicEvent_emit","emitChanged","undoRedoContext","Object","assign","canClear","empty","emitIdle","idle","emitCleared","model","emitConverted","emitImported","_a$1","WeakMap","WeakSet","type","data","evt","CustomEvent","bubbles","composed","detail","undefined","dispatchEvent","_b","InternalEvent","_InternalEvent_abortController","AbortController","_InternalEvent_instance","removeAllListeners","abort","emitSVGPatch","patchChange","_InternalEvent_instances","_InternalEvent_emit","addSVGPatchListener","callback","addEventListener","signal","addExportedListener","emitClearMessage","addClearMessageListener","emitError","err","addErrorListener","emitWSClosed","addWSClosedListener","emitNotif","notif","addNotifListener","emitImportJIIX","jiix","addImportJIIXListener","emitConvert","conversionState","addConvertListener","emitClear","addClearListener","emitContextChange","context","addContextChangeListener","addIdleListener","SmartGuide","_SmartGuide_smartGuideElement","_SmartGuide_prompterContainerElement","_SmartGuide_prompterTextElement","_SmartGuide_ellipsisElement","_SmartGuide_tagElement","_SmartGuide_candidatesElement","_SmartGuide_menuElement","_SmartGuide_convertElement","_SmartGuide_copyElement","_SmartGuide_deleteElement","_SmartGuide_fadeOutTimout","_SmartGuide_isMenuOpen","_SmartGuide_showCandidates","target","wordId","parseInt","id","replace","uuid","words","wordToChange","toString","innerHTML","candidates","style","display","forEach","word","index","label","top","left","getBoundingClientRect","parent","_d","_c","parentNode","insertBefore","_e","_SmartGuide_onClickEllipsis","preventDefault","stopPropagation","_SmartGuide_instances","_SmartGuide_hideCandidates","_SmartGuide_onClickConvert","internalEvent","_SmartGuide_closeMenu","_SmartGuide_onClickCopy","message","innerText","navigator","clipboard","writeText","timeout","_SmartGuide_onClickDelete","_SmartGuide_onClickCandidate","candidate","includes","_SmartGuide_onClickPrompter","_SmartGuide_onClickOutSide","Math","random","substring","margin","bottom","right","_SmartGuide_createWrapperElement","_SmartGuide_createPrompterContainerElement","_SmartGuide_createPrompterTextElement","_SmartGuide_createEllipsisElement","_SmartGuide_createTagElement","_SmartGuide_createCandidatesElement","_SmartGuide_createMoreMenuElement","_SmartGuide_createConvertElement","_SmartGuide_createCopyElement","_SmartGuide_createDeleteElement","getInstance","init","domElement","renderingConfiguration","appendChild","classList","add","_SmartGuide_addListeners","_SmartGuide_show","smartGuide","fadeOut","enable","_SmartGuide_initFadeOutObserver","duration","resize","mmToPixels","marginTop","marginLeft","marginRight","offsetWidth","width","clientWidth","offsetHeight","update","createWordSpan","span","document","createElement","textContent","myFragment","createDocumentFragment","length","lastWord","scrollLeft","offsetLeft","populatePrompter","clear","_SmartGuide_hide","destroy","setAttribute","MutationObserver","clearTimeout","contains","setTimeout","observe","childList","subtree","attributes","remove","_SmartGuide_openMenu","DeferredPromise","isFullFilled","isPending","promise","v","PointerEventGrabber","configuration","prevent","pointerDownHandler","button","buttons","activePointerId","pointerId","onPointerDown","point","extractPoint","pointerMoveHandler","onPointerMove","pointerUpHandler","onPointerUp","roundFloat","oneFloat","requestedFloatPrecision","floatPrecision","pow","round","event","clientX","clientY","changedTouches","rect","x","clientLeft","xyFloatPrecision","y","clientTop","t","Date","now","timestampFloatPrecision","p","pressure","attach","detach","listenerOptions","documentElement","removeEventListener","_f","ShapeSymbols","table","shape","recognizedShape","ellipse","line","phi","angle","returnedAngle","PI","drawArrowHead","context2D","headPoint","alpha","beta","save","fillStyle","strokeStyle","moveTo","beginPath","lineTo","cos","sin","fill","restore","drawShapeEllipse","shapeEllipse","points","drawEllipseArc","centerPoint","maxRadius","minRadius","orientation","startAngle","sweepAngle","z1","z3","z2","z4","n","floor","abs","boundariesPoints","i","atan2","cosAlpha","sinAlpha","push","stroke","beginDecoration","beginTangentAngle","endDecoration","endTangentAngle","drawLine","p1","p2","drawShapeSymbol","symbol","lineWidth","color","elementType","shapeSymbol","selectedCandidateIndex","lines","lineSymbol","drawShapeLine","shapeLine","firstPoint","lastPoint","primitives","primitive","drawStroke","stroker","pointerType","TextSymbols","inputCharacter","char","string","textLine","drawTextLine","drawText","font","textHeight","textAlign","justificationType","textBaseline","fillText","topLeftPoint","height","underlineList","underline","drawUnderline","delta","firstCharacter","lastCharacter","drawTextSymbol","console","info","computeLinksPoints","radius","computeMiddlePoint","point1","point2","computeAxeAngle","begin","end","CanvasStroker","renderArc","context2d","center","arc","renderLine","linkPoints1","linkPoints2","renderFinal","linkPoints","newAngle","renderQuadratic","ctrl","linkPoints3","quadraticCurveTo","NUMBER_POINTS","pointers","NUMBER_QUADRATICS","secondPoint","beginLine","endLine","beginFinal","endFinal","closePath","CanvasRenderer","config","createCanvas","canvas","resizeContent","pixelRatio","window","devicePixelRatio","renderingCanvas","capturingCanvas","max","minWidth","minHeight","clientHeight","getContext","scale","drawSymbol","keys","element","renderingCanvasContext","capturingCanvasContext","drawModel","clearRect","rawStrokes","drawPendingStroke","module","o","r","l","m","c","d","defineProperty","configurable","enumerable","__esModule","default","prototype","hasOwnProperty","s","Symbol","iterator","toJSON","error","u","split","trim","indexOf","_trimSemiColon","toCSS","slice","parser","JsonCSS","StyleHelper","themeToCSS","json","themeToJSON","theme","Number","ink","penStyleToCSS","penStyle","css","penStyleToJSON","penStyleString","stringToJSON","JSONToString","entries","map","k","join","CryptoJS","create","F","obj","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","$super","arguments","instance","properties","propertyName","clone","WordArray","sigBytes","encoder","Hex","stringify","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","_r","C_enc","enc","hexChars","bite","parse","hexStr","hexStrLength","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","key","C_algo","HMAC","algo","require$$0","X32WordArray","C_x64","x64","Word","high","low","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","X64Word","X64WordArray","X64Word_create","K","W","SHA512","_hash","M","H","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","al","bh","bl","ch","cl","dh","dl","eh","fh","fl","gh","gl","hh","hl","Wi","Wih","Wil","gamma0x","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1x","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","t1l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1h","t2l","nBitsTotal","nBitsLeft","HmacSHA512","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","computeHmac","applicationKey","hmacKey","isVersionSuperiorOrEqual","source","sourceParts","targetParts","a","b","Stroke","convertStrokeToJSON","RestRecognizer","serverConfig","recognitionConfig","serverConfiguration","recognitionConfiguration","url","scheme","host","postConfig","lang","diagram","export","math","text","buildData","strokeGroupByPenStyle","groupIndex","findIndex","sg","isPenStyleEqual","ps1","ps2","strokes","strokeGroupsToSend","group","newGroup","JSON","contentType","charAt","toUpperCase","toLowerCase","xDPI","yDPI","strokeGroups","post","mimeType","headers","Headers","append","version","reqInit","method","body","request","Request","response","fetch","ok","blob","catch","tryFetch","res","ErrorConst","code","getMimeTypes","requestedMimeTypes","mimeTypes","convert","myModel","getClone","dataToConcert","promises","mt","all","mergeConvert","mimeTypesRequiringExport","filter","mergeExport","UndoRedoContext","stackIndex","possibleUndoCount","canRedo","canUndo","stack","UndoRedoManager","updateCanUndoRedo","currentModel","addModelToStack","maxStackSize","shift","removeLastModelInStack","pop","updateModelInStack","modificationDate","undo","redo","mergeDeep","sources","isObject","item","Array","isArray","DefaultPenStyle","DefaultTheme","StyleManager","_StyleManager_penStyle","_StyleManager_theme","_StyleManager_penStyleClasses","_StyleManager_currentPenStyle","setTheme","setPenStyleClasses","setPenStyle","currentPenStyle","structuredClone","penStyleClasses","psc","DefaultServerConfiguration","protocol","useWindowLocation","websocket","pingEnabled","pingDelay","maxPingLostCount","autoReconnect","maxRetryCount","fileChunkSize","DefaultRecognitionConfiguration","alwaysConnected","gesture","chars","renderer","debug","solver","eraser","mode","guides","recognition","DefaultGrabberConfiguration","capture","passive","DefaultRenderingConfiguration","gap","DefaultTriggerConfiguration","exportContent","exportContentDelay","resizeTriggerDelay","DefaultEventsConfiguration","processDelay","DefaultUndoRedoConfiguration","DefaultConfiguration","server","grabber","rendering","triggers","events","Configuration","overrideDefaultConfiguration","defaultConf","_g","location","computeDistance","distance","hypot","isNaN","Model","creationDate","creationTime","selectedStrokes","positions","lastSentPosition","lastReceivedPosition","converts","computePressure","globalDistance","ratio","sqrt","filterPointByAcquisitionDelta","lastPointer","addPoint","pointer","at","addStroke","extractUnsentStrokes","initCurrentStroke","dpi","pxWidth","currentStroke","appendToCurrentStroke","endCurrentStroke","resetSelectedStrokes","appendSelectedStrokesFromPoint","_Model_instances","_Model_getStrokeFromPoint","updateStroke","updatedStroke","strokeIndex","removeStroke","removeStrokesFromPoint","strokeToRemove","updatePositionSent","position","updatePositionReceived","clonedModel","isBetween","val","_strokeList","strokePointer","RestBehaviors","options","name","_RestBehaviors_configuration","_RestBehaviors_model","_RestBehaviors_resizeTimer","_RestBehaviors_exportTimer","styleManager","recognizer","undoRedoManager","ps","bind","updateModelRendering","drawCurrentStroke","_evt","newModel","deferred","deferredResize","resizeModel","WSRecognizer","pingCount","reconnectionCount","toLocaleLowerCase","infinitePing","socket","close","readyState","send","openCallback","connected","params","sessionId","iinkSessionId","xDpi","yDpi","viewSizeHeight","viewSizeWidth","rejectDeferredPending","initialized","addStrokeDeferred","exportDeferred","_h","convertDeferred","_j","_k","importDeferred","_l","_m","resizeDeferred","_o","_p","undoDeferred","_q","redoDeferred","_s","_t","clearDeferred","_u","waitForIdleDeferred","_v","closeCallback","currentErrorCode","reason","manageHMACChallengeMessage","websocketMessage","hmacChallengeMessage","hmacChallenge","hmac","manageContentPackageDescriptionMessage","currentPartId","managePartChangeMessage","partChangeMessage","partId","manageExportMessage","exportMessage","importPointEventsDeferred","manageWaitForIdle","manageErrorMessage","manageContentChangeMessage","contentChangeMessage","undoStackIndex","manageSVGPatchMessage","svgPatchMessage","messageCallback","WebSocket","OPEN","CONNECTING","addStrokes","localModel","styleClasses","import","chunkSize","importFileId","readBlob","fileReader","FileReader","onloadend","ev","onerror","readAsText","importFileMessage","size","blobPart","fileChuckMessage","lastChunk","importPointEvents","exportPoints","myExportConverted","waitForIdle","undoExports","redoExports","clearExports","SVGStroker","getArcPath","getLinePath","getFinalPath","parts","getQuadraticPath","central","buildSVGPath","STROKE_LENGTH","STROKE_WIDTH","NB_QUADRATICS","beforeLastPoint","svgElement","attrs","svgPathElement","createElementNS","svgPath","WSSVGRenderer","fontSize","updateLayer","layerName","_WSSVGRenderer_instances","_WSSVGRenderer_replaceElement","_WSSVGRenderer_removeElement","_WSSVGRenderer_removeChild","_WSSVGRenderer_insertBefore","_WSSVGRenderer_setAttribute","_WSSVGRenderer_removeAttribute","updatesLayer","updates","clearPendingStroke","pendingStrokeGroup","querySelector","oldStroke","svgList","querySelectorAll","svg","_WSSVGRenderer_drawStroke","_WSSVGRenderer_replaceAll","oldLayer","insertAdjacentHTML","layer","pendingStrokesGroup","elementToRemove","_WSSVGRenderer_appendChild","parentSelector","parentId","refId","selector","removeAttribute","WSBehaviors","_WSBehaviors_configuration","_WSBehaviors_model","_WSBehaviors_resizeTimer","onSVGPatch","onContextChange","updatedModel","styleInject","ref","insertAt","head","getElementsByTagName","firstChild","styleSheet","cssText","createTextNode","defaultBehaviors","_Editor_behaviors","behaviors","_Editor_initializeBehaviors","_Editor_initializationDeferred","_Editor_instances","_Editor_cleanMessage","wrapperHTML","editor","_Editor_showError","finally","_Editor_initializeSmartGuide","_Editor_smartGuide","_Editor_messageHTML","pName","prepend","pStack","_Editor_showStrokesIfDebug","panel","getElementById","_Editor_showNotif","_Editor_addListeners","_Editor_onImportJIIX","_Editor_onExport","_Editor_onContextChange","_Editor_onIdleChange","jjix","Blob","Editor","globalClassCss","_Editor_loaderHTML","_Editor_instantiateBehaviors","initializationPromise","initialize","cursor","blobToImport","getAvailableFontList","sort","getAvailableLanguageList"],"mappings":"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"} \ No newline at end of file diff --git a/examples/server-configuration.json b/examples/server-configuration.json index 8ace2172..ac60f62c 100644 --- a/examples/server-configuration.json +++ b/examples/server-configuration.json @@ -1,6 +1,6 @@ { - "scheme": "http", - "host": "localhost:8897", - "applicationKey": "30a605cb-95ea-45ac-aea5-c093322c5100", - "hmacKey": "dc2afdde-40e9-4e96-9d11-430100771123" + "scheme": "https", + "host": "cloud.preprod.myscript.com", + "applicationKey": "df0e4940-0927-45f0-9873-686bfd51395d", + "hmacKey": "b12a8e02-ce2a-4539-b4d8-b8c1b09fda1d" } diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 73b1792a595144fc4b21a7aa3207c491cd9065b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmbu3u?>JQ35J|Gw{0tm#( zM0BrOO0P{`tGu@9znU=(<5blwn5}5p=@s9cSvf1=Y2DtQGa%wgBH60$+>aSZ LR|nsvhxYFVnB5%* diff --git a/index.html b/index.html new file mode 100644 index 00000000..d04f1836 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +Title diff --git a/jest.integration.config.js b/jest.integration.config.js deleted file mode 100644 index 497e6ae4..00000000 --- a/jest.integration.config.js +++ /dev/null @@ -1,30 +0,0 @@ -export default { - preset: "jest-playwright-preset", - - testEnvironmentOptions: { - "jest-playwright": { - browsers: process.env.BROWSER ? [process.env.BROWSER] : ["chromium", "firefox", "webkit"], - - channel: process.env.CHANEL, // "chrome", "chrome-beta", "chrome-dev", "chrome-canary", "msedge" - - devices: process.env.DEVICE ? [process.env.DEVICE] : null, - - contextOptions: { - baseURL: process.env.BASE_URL || "http://localhost:8000", - ignoreHTTPSErrors: true, - }, - - exitOnPageError: false, - - launchOptions: { - headless: process.env.HEADLESS === "false" ? false : true, - }, - }, - }, - - setupFilesAfterEnv: ["expect-playwright", "./test/integration/jest.setup.js"], - - testMatch: ["**/integration/**/*.test.js"], - - verbose: false, -} diff --git a/jest.unit.config.js b/jest.unit.config.js deleted file mode 100644 index 54aa8407..00000000 --- a/jest.unit.config.js +++ /dev/null @@ -1,42 +0,0 @@ - -export default { - clearMocks: true, - // collectCoverage: true, - collectCoverageFrom: [ - "./src/**", - "!./src/@types/**" - ], - coverageThreshold: { - global: { - branches: 80, - functions: 80, - lines: 80, - // statements: -10, - }, - }, - coverageDirectory: "coverage", - coverageProvider: "v8", - moduleFileExtensions: [ - "ts", - "js" - ], - preset: "ts-jest", - setupFiles: [ - "jest-canvas-mock", - "./test/unit/jest.setup.js" - ], - setupFilesAfterEnv: [ - "jest-websocket-mock" - ], - testEnvironment: "jsdom", - testMatch: [ - "**/unit/**/*.test.ts" - ], - testPathIgnorePatterns: [ - "/node_modules/" - ], - transform: { - "^.+\\.css$": "jest-transform-css" - }, - verbose: false -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ffdc1c3b..00000000 --- a/package-lock.json +++ /dev/null @@ -1,21241 +0,0 @@ -{ - "name": "iink-ts", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "iink-ts", - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "crypto-js": "^3.3.0", - "json-css": "^1.5.6" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.3.0", - "@types/jest": "^29.2.0", - "@types/node": "^18.11.5", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "babel-jest": "^29.2.2", - "eslint": "^8.22.0", - "eslint-plugin-jest": "^27.1.3", - "eslint-plugin-playwright": "^0.11.2", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.4.0", - "jest-environment-jsdom": "^28.1.3", - "jest-fetch-mock": "^3.0.3", - "jest-playwright-preset": "^2.0.0", - "jest-transform-css": "^4.0.1", - "jest-websocket-mock": "^2.4.0", - "npm-run-all": "^4.1.5", - "playwright": "^1.27.1", - "postcss": "^8.4.16", - "rollup": "^2.76.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^4.2.2", - "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-serve": "^2.0.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.32.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tslib": "^2.4.0", - "typedoc": "^0.23.24", - "typedoc-plugin-missing-exports": "^1.0.0", - "typescript": "^4.7.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "peer": true, - "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/expect/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/globals/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^2.42.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", - "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", - "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "node_modules/@types/wait-on": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", - "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", - "integrity": "sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/type-utils": "5.33.1", - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz", - "integrity": "sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", - "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-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==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/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, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "node_modules/cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dev": true, - "dependencies": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/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==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "dependencies": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/del/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "27.1.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.6.tgz", - "integrity": "sha512-XA7RFLSrlQF9IGtAmhddkUkBuICCTuryfOTfCSWcZHiHb69OilIH05oozH2XA6CEOtztnOd0vgXyvxZodkxGjg==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-playwright": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.11.2.tgz", - "integrity": "sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==", - "dev": true, - "peerDependencies": { - "eslint": ">=7", - "eslint-plugin-jest": ">=24" - }, - "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect-playwright": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", - "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "dev": true - }, - "node_modules/expect/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expect/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dev": true, - "dependencies": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dev": true, - "dependencies": { - "find-file-up": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "bin": { - "find-process": "bin/find-process.js" - } - }, - "node_modules/find-process/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dev": true, - "dependencies": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-canvas-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz", - "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==", - "dev": true, - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "dependencies": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-playwright-preset": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-2.0.0.tgz", - "integrity": "sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==", - "dev": true, - "dependencies": { - "expect-playwright": "^0.8.0", - "jest-process-manager": "^0.3.1", - "nyc": "^15.1.0", - "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", - "uuid": "^8.3.2" - }, - "peerDependencies": { - "jest": "^28.0.0", - "jest-circus": "^28.0.0", - "jest-environment-node": "^28.0.0", - "jest-runner": "^28.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-process-manager": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.3.1.tgz", - "integrity": "sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==", - "dev": true, - "dependencies": { - "@types/wait-on": "^5.2.0", - "chalk": "^4.1.0", - "cwd": "^0.10.0", - "exit": "^0.1.2", - "find-process": "^1.4.4", - "prompts": "^2.4.1", - "signal-exit": "^3.0.3", - "spawnd": "^5.0.0", - "tree-kill": "^1.2.2", - "wait-on": "^5.3.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runner/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", - "dev": true, - "dependencies": { - "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", - "postcss-modules": "4.3.1", - "style-inject": "0.3.0" - }, - "peerDependencies": { - "postcss": "^8.4.12" - } - }, - "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-websocket-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz", - "integrity": "sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==", - "dev": true, - "dependencies": { - "jest-diff": "^28.0.2", - "mock-socket": "^9.1.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-css": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/json-css/-/json-css-1.5.6.tgz", - "integrity": "sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ==" - }, - "node_modules/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 - }, - "node_modules/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 - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/livereload": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", - "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.0", - "livereload-js": "^3.3.1", - "opts": ">= 1.2.0", - "ws": "^7.4.3" - }, - "bin": { - "livereload": "bin/livereload.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/livereload-js": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", - "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", - "dev": true - }, - "node_modules/livereload/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "dependencies": { - "color-name": "^1.1.4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/npm-run-all/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/npm-run-all/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/npm-run-all/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/opts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", - "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.1.tgz", - "integrity": "sha512-GnEizysWMvoqHC3I9l8+4/ZxeLwLNdJJG76xdKGxzOcIZDcw5RSk/FKrFb5CuA+zcLpjIM2p9eR9Z4CuUDkWXg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.32.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-core": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.1.tgz", - "integrity": "sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "dependencies": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-load-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/postcss-load-config/node_modules/cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/postcss-load-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise-polyfill": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", - "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==", - "dev": true - }, - "node_modules/promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dev": true, - "dependencies": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.12.0" - } - }, - "node_modules/rollup-plugin-commonjs/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", - "dev": true, - "dependencies": { - "del": "^5.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/rollup-plugin-dts": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.2.tgz", - "integrity": "sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.26.1" - }, - "engines": { - "node": ">=v12.22.11" - }, - "funding": { - "url": "https://github.com/sponsors/Swatinem" - }, - "optionalDependencies": { - "@babel/code-frame": "^7.16.7" - }, - "peerDependencies": { - "rollup": "^2.55", - "typescript": "^4.1" - } - }, - "node_modules/rollup-plugin-dts/node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/rollup-plugin-livereload": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz", - "integrity": "sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==", - "dev": true, - "dependencies": { - "livereload": "^0.9.1" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "8.x" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-postcss/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-2.0.1.tgz", - "integrity": "sha512-/9lnzylTMwbXNQUwWAO0DIxW145wl+rmikwFXgujLJ5N9bRfWcjP+qd1XM5wxSiw8ZlBAlFy/n2zRvzcG21bBw==", - "dev": true, - "dependencies": { - "mime": ">=2.4.6", - "opener": "1" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz", - "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawnd": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz", - "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "wait-port": "^0.2.9" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "dev": true, - "peerDependencies": { - "typedoc": "0.22.x || 0.23.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "dependencies": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/wait-port": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", - "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wait-port/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wait-port/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wait-port/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/wait-port/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/wait-port/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/wait-port/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/wait-port/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wait-port/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "peer": true, - "requires": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "dependencies": { - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0" - } - }, - "@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "@sinclair/typebox": { - "version": "0.24.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", - "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/node": { - "version": "18.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", - "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "@types/wait-on": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", - "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", - "integrity": "sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/type-utils": "5.33.1", - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz", - "integrity": "sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", - "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "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": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "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" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", - "dev": true, - "requires": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "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==", - "dev": true - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "dev": true - }, - "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" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "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" - } - } - } - }, - "ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "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 - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "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" - } - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, - "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" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dev": true, - "requires": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - } - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "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==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", - "dev": true - }, - "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "peer": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "27.1.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.6.tgz", - "integrity": "sha512-XA7RFLSrlQF9IGtAmhddkUkBuICCTuryfOTfCSWcZHiHb69OilIH05oozH2XA6CEOtztnOd0vgXyvxZodkxGjg==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "^5.10.0" - } - }, - "eslint-plugin-playwright": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.11.2.tgz", - "integrity": "sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "expect-playwright": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", - "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "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" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - } - }, - "find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dev": true, - "requires": { - "find-file-up": "^0.1.2" - } - }, - "find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "requires": { - "loader-utils": "^3.2.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "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 - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "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 - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "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, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "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 - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "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 - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - } - }, - "jest-canvas-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz", - "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==", - "dev": true, - "requires": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "peer": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - } - } - }, - "jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "requires": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true - }, - "jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - } - } - }, - "jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-playwright-preset": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-2.0.0.tgz", - "integrity": "sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==", - "dev": true, - "requires": { - "expect-playwright": "^0.8.0", - "jest-process-manager": "^0.3.1", - "nyc": "^15.1.0", - "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", - "uuid": "^8.3.2" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-process-manager": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.3.1.tgz", - "integrity": "sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==", - "dev": true, - "requires": { - "@types/wait-on": "^5.2.0", - "chalk": "^4.1.0", - "cwd": "^0.10.0", - "exit": "^0.1.2", - "find-process": "^1.4.4", - "prompts": "^2.4.1", - "signal-exit": "^3.0.3", - "spawnd": "^5.0.0", - "tree-kill": "^1.2.2", - "wait-on": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true - }, - "jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - } - }, - "jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - } - }, - "jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "peer": true, - "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", - "dev": true, - "requires": { - "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", - "postcss-modules": "4.3.1", - "style-inject": "0.3.0" - } - }, - "jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-websocket-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz", - "integrity": "sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==", - "dev": true, - "requires": { - "jest-diff": "^28.0.2", - "mock-socket": "^9.1.0" - }, - "dependencies": { - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true - } - } - }, - "jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.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-css": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/json-css/-/json-css-1.5.6.tgz", - "integrity": "sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ==" - }, - "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", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "livereload": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", - "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "dev": true, - "requires": { - "chokidar": "^3.5.0", - "livereload-js": "^3.3.1", - "opts": ">= 1.2.0", - "ws": "^7.4.3" - }, - "dependencies": { - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - } - } - }, - "livereload-js": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", - "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.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": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", - "dev": true - }, - "moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "requires": { - "color-name": "^1.1.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 - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "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 - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "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": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "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": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "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" - } - } - } - }, - "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" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "opts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", - "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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 - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "playwright": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.1.tgz", - "integrity": "sha512-GnEizysWMvoqHC3I9l8+4/ZxeLwLNdJJG76xdKGxzOcIZDcw5RSk/FKrFb5CuA+zcLpjIM2p9eR9Z4CuUDkWXg==", - "dev": true, - "requires": { - "playwright-core": "1.32.1" - } - }, - "playwright-core": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.1.tgz", - "integrity": "sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA==", - "dev": true - }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "requires": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "promise-polyfill": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", - "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==", - "dev": true - }, - "promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "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==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "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" - } - }, - "rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", - "dev": true, - "requires": { - "del": "^5.1.0" - } - }, - "rollup-plugin-dts": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.2.tgz", - "integrity": "sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "magic-string": "^0.26.1" - }, - "dependencies": { - "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "rollup-plugin-livereload": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz", - "integrity": "sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==", - "dev": true, - "requires": { - "livereload": "^0.9.1" - } - }, - "rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "dependencies": { - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "rollup-plugin-serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-2.0.1.tgz", - "integrity": "sha512-/9lnzylTMwbXNQUwWAO0DIxW145wl+rmikwFXgujLJ5N9bRfWcjP+qd1XM5wxSiw8ZlBAlFy/n2zRvzcG21bBw==", - "dev": true, - "requires": { - "mime": ">=2.4.6", - "opener": "1" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "rollup-plugin-typescript2": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz", - "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "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 - }, - "shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true - }, - "shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "requires": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "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 - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - } - } - }, - "spawnd": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz", - "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==", - "dev": true, - "requires": { - "exit": "^0.1.2", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "wait-port": "^0.2.9" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "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" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "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" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "requires": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "dev": true, - "requires": {} - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - } - }, - "wait-port": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", - "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.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, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index ad321b19..00000000 --- a/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "iink-ts", - "version": "1.0.0-buildVersion", - "description": "iinkTS is the fastest way to integrate handwriting panel and recognition in your webapp", - "license": "Apache-2.0", - "private": false, - "main": "dist/iink.min.js", - "module": "dist/iink.esm.js", - "type": "module", - "types": "dist/iink.d.ts", - "keywords": [ - "myscript", - "javascript", - "developer", - "handwriting", - "recognition", - "cloud", - "iink" - ], - "files": [ - "dist", - "package.json" - ], - "homepage": "https://myscript.github.io/iinkTS/", - "repository": "git://github.com/MyScript/iinkTS.git", - "scripts": { - "lint": "eslint ./src --ext .ts", - "lint:fix": "eslint ./src --ext .ts --fix", - "test:unit": "jest --config=jest.unit.config.js", - "test:unit:coverage": "jest --config=jest.unit.config.js --coverage", - "test:integration": "jest --config=jest.integration.config.js", - "build:docs": "typedoc", - "build:lib": "rollup -c config/rollup.config.build.js --sourcemap", - "build": "npm-run-all lint:fix test:unit build:lib build:docs", - "dev": "rollup -c config/rollup.config.dev.js -w --sourcemap" - }, - "dependencies": { - "crypto-js": "^3.3.0", - "json-css": "^1.5.6" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.3.0", - "@types/jest": "^29.2.0", - "@types/node": "^18.11.5", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "babel-jest": "^29.2.2", - "eslint": "^8.22.0", - "eslint-plugin-jest": "^27.1.3", - "eslint-plugin-playwright": "^0.15.3", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.4.0", - "jest-environment-jsdom": "^28.1.3", - "jest-fetch-mock": "^3.0.3", - "jest-playwright-preset": "^3.0.1", - "jest-transform-css": "^6.0.1", - "jest-websocket-mock": "^2.4.0", - "npm-run-all": "^4.1.5", - "playwright": "^1.36.1", - "postcss": "^8.4.16", - "rollup": "^2.76.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^4.2.2", - "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-serve": "^2.0.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.32.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tslib": "^2.4.0", - "typedoc": "^0.23.24", - "typedoc-plugin-missing-exports": "^1.0.0", - "typescript": "^4.7.4" - }, - "resolutions": { - "**/loader-utils": "3.2.1", - "**/json5": "2.2.2" - } -} diff --git a/plugins/typdoc-default-object.ts b/plugins/typdoc-default-object.ts deleted file mode 100644 index f30d8423..00000000 --- a/plugins/typdoc-default-object.ts +++ /dev/null @@ -1,42 +0,0 @@ -// @ts-check -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { TypeScript, Converter } = require("typedoc") - -exports.load = function ({ application }) -{ - const defaultValues = new Map() - - const printer = TypeScript.createPrinter({ - removeComments: true, - omitTrailingSemicolon: true, - newLine: TypeScript.NewLineKind.LineFeed - }) - - application.converter.on( - Converter.EVENT_CREATE_DECLARATION, - (context, reflection) => - { - const symbol = context.project.getSymbolFromReflection(reflection) - if (!symbol) return - - const decl = symbol.getDeclarations()?.find(TypeScript.isVariableDeclaration) - if (!decl || !decl.initializer) return - - if (decl.initializer.kind === TypeScript.SyntaxKind.ObjectLiteralExpression) { - // Unfortunately can't just set defaultValue right here, this happens before TD sets it. - defaultValues.set( - reflection, - printer.printNode(TypeScript.EmitHint.Expression, decl.initializer, decl.getSourceFile()) - ) - } - } - ) - - application.converter.on(Converter.EVENT_RESOLVE_BEGIN, () => - { - for (const [refl, init] of defaultValues) { - refl.defaultValue = init.replace("/n", "
") - } - defaultValues.clear() - }) -} diff --git a/preview.gif b/preview.gif deleted file mode 100644 index 80b1e8505ebca90eb9f9f6dc3e2692a02d11f9f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190750 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%0DL!Dc~8kpN}`uF1J^?V-|^{euMf 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

Ub(e0xK> z0NOKX8=w8&n%UR&C(@pSl(y(zA~LY3?C!?qQ)j_Tp2Hp%rd;00#@%L-fX%m>VZLbC z*nD`_TkX%30)n*72^*V_%@;N62ypcN{qUBo_Lc`5-M)5tSM|`j|3kX{?f)z`8$7!P9&adEgwE?^@q4QE znM*g5*m6*^TxyXn5|uv&$~u*ftG>_JMP<~aSYc+fKc1LtiKfIZoFHTeXdU}A=k=kb zrm8cR`aFWX#ZY;}=jQYKt6=pFA-*S(WY$=#ALpQq#|91efe?3tC>50i*W6n;FXOn-VT8;^E1xCweP{T^KOD6JItdE-;$=!Y^ zlAnH14hYq@Vv+^Zzg+dsJ!A(>j36~|q9{F?1eAbJLe%74N)-~|01PV3B|T3Z6?0_h zKIGEa@|9`YEexG}io7+nG}nKo_FC0r6y_%JwYDPGndb7Pnsq#h+-x z*}r~`zYL0hx!(NgEb!ZF{B^y#tl-@B`)joLyELu;Ovd_uNFDx9us;7IdF02Zyg;pi|Ni)wRTa^e|NiRkgm>FzeAxZ?UNzQCs65U9t)k$t2#Ar>{lgr z#!uEFfGdUyw>X?$cXaa^X3wBiJoXg#x>I_r;zjE}b%K8gEf_|mB-;l|GcEzzpgwE8 z3@H+@*z~s~yI&aBAy6uK#1=Uh^hwry;x&HnUmef1B=HwSHgoc-zh^Vm<3S{Scv<}; z$qxGWQYUr^Ihu;);sRqHO7Tp1DO=W+zr7p0Fr^)0OHWP&lSqOxE|EnSa=t43gcel4 z*_1HyZariTM7UEiKa=cU-<#BLEn>?I@4i$ab9>^)lIEX0+#?KD>E&vDh$LfDy*7vu z^BL9BS>fgu8I1|ns}P*&osXkhpI*}4~c zUG4SZN!LupN4|2E=WS8O3^kmOXyC$MYi6^J{5p2?Xi?Y4Y1N4DYj^km>Fp^)K>0s7 z2mhlfB%f?43jqW_-1auk!SU+3`F+sU z&g5omlMD zII8(a-QOxxNRh$h@)GMR$Dz7^=J{3lKoJ|ruB-hlWQJ4lCQ zJNg(wDO}gZw|zSZWow^^3f(c7&uoM?(!0{T?LU~~x>y}o-PR$1K-WcHvkyZx7_MDj zWDXw+y0uj%e0gahjhF8f?%a0>)^f2}Uw$z}{_lsi{_5@Bddu=hC~dnbT^LtyCu zj2t>$405QEZ^`Me_~uk$DiDQ`f&0Ym7?6mys1>tQsE$-&&JaI3C(dSbum{pbKqJ`0 zIxV4Z?qX6M3ecT{9f$^w(sLBVCMu2ErR;C0Q%ak;iN+Ejv&rIA~Kpbosko`cn)YxqG z54N(Xa0N6?hLODKs(^O4=*h`HVXy*Up?F}MT`(#1SPs$sFob6PCQZrSp{~c5ZbalD zf%3Yu%YSTTHnRj7L`W(Ymry?R14LsD3 za@o!Fd2m7qU&v051~g33lCsocK;sJSU0I9Gfa1hThN!{`RO$6;oM{L45!?+S6woJ0Liw4r4 z91;(K>dv|4?`cO;e?9AL0OWzc0pt*Ao=|a~ZVh5N8;yQZyBQJr&#H+QN%A&ZigF*! zb^k$1mA~-H3>!sMLoe84iRP|d&=$U1)VM{GMN}O5!J)XS=t&-{NDMa}gtl-wRkYHj zfo4&d2+ij$=E-OgJBvCxv$IC&g{X^izP_0O&8{jiJEEAp*Uk`YIXtCoVLro7l0iBF zBEh%br^rl-v#*X;98O8gMKglD?HIz>?e*UMJnI<#<~F;LBK&Uy?Y%NyY zV2QOOo5(6$FJ_phrQ<@`%mJNsc*^7ef?zp|cnmztQ_Le=6iWs|bTx2zHFg|;;)`KH z=}S3!QWM>rZQh>opAZ~ADaTzs90Z_gZ3Lt5g6~9wx{p1J4%?Wc1*KS}DBBMHnYQ+i zXXHr1u_WO*%ELU%6vQc-k@ts|U(=rdm{a&0WoQ=xNgj#s*ovlPdOY5%>krx*w4chi zSf}Zt)6L`&tZau2SQ*mv4r!P{)*t(6SH1!odR6EZzD4U zo(qZYO7pWO!wyw=k7s8elOb{f00T~oYe*I0i0);0=2G<@f&i!^JXt_x)s7@;dc{l@ zCdAju1Da6PFZS5wu3&#NcWTO^j62t8@@921pKn=x>Pg@7#?3Xpx3=p|WmnMor)>g) zD!28OwhB)xnFo$-epUK--_7K3rnQ1$)$>!Yv6ZKkeT(ZxQlqT(Q$ig-Hb~$VvB2v} z#iNEo#xB^Jg|VAh04~~Ec7Fy%Bs~a^Vq-SJ*!zy^3)!D$w!oj!%84KJf9$8Fa}PyN z&&)w{iqd?CjNwc`C!w(M;{$~{EAdAvdB1iHJXBsdK{?o8XmSiAEH%)gc*glwYeD1y z(`B;%ub*v1K6(P=vH%GOJLKtkEc~hNzpi$lM~XJ_AmgwVJaT&};@AE#vktiDF75do zFOJaVuD6|ay!{j8D|b#yDRLr7V_PICG(sr$WZln@^4%-wNPwh-@VL`wLSzx<75K?{ zZ*eHV3@}?ts9Oc|-PgK*jMsB9{DvU|dE8P-F2N!{88nBAnrvxCTv3r544P%L>FLI%eKqmcK1+ulmGl|9!fT zE!yLX?bbnvH;q<6x%~HDjdc!I;xdCgOfQ)VzI7PC{_1>$=XKP)yjS2=Ya1gLx9+VI zxwoAoE@9y$ZCqYTbLum8kPmyPAhXuP1uza$Q1BHu-a-VdlS)clc?auW70VFT8>UK6 zA}yxNj)%x70`*@*)5`9n*aRw?`Cs$hekkk9OM@?OB>~p*ie;qZ{2fm-D|g>iwz$w$ z?0XE}L!PPqXC#f^dDB%_{plJWCp+_-gp{7r5t?3VE$gl|YWuKTGCkV(J^%b{)BK>T zabfBF#=&R)ky^XbLbuinzl9#1@zRA}-Nl)O$3%#2*|!l={=`hK>~p`>mf6owNv6tQ z2JH6xe|cu_S@z|*)9KkSFI-}kzrJ)&^Zz>NRao}*m0#T~#7k>eUVIbu!hi8?@Oatc zJBZLayEsHu5SkIUnJW+USZDpno64NrBzum;6pD_+X*4Z5p?qwGbmi2x0T$ylcgemu8YyS`HrJC_Uwwbh>Qa-(QX=VD{w9zR zPx;HX(wdj2{vCSOEjKBf=BfLidZ~yy;O4iZO*0pc$2X(@UXAz5pRaM`R7TNkN3u#c zvx#6?Qd*^auB(Czgl4oy>b@*Q01U3fhRdSV$gte8%y}YUC}zr} z%O-Ie(2cb5o`lqRKmYt)!9&*%eQaoNUjkAVFGx%_3mpCJ&*y4_wTpHidSNQTX|hRY z?zwbq_}3E31-qJETtlU1j1$>|8(h~GBxgu~p4G<}c(=!{4=y^de*NE~##{RDRO9Uq zoxe9-D zns>ViFQj)^-Oxzu?Dp8UaJ4V#hE}0@kB{R*#>?&-o9jAz0zwzAG1v=r+Rb~9XDnn+ zSQT!2(b;>dVIhl|RH!>{zUKhy7q04t=!E^RQO1^7l&SvjG^AgzOWY$xmRR{Ke?u9e zV%TPBqebTmoa`6j(31Je3rM9HT{HXrx}+8BhLf_!$8dss&r+ead*GH!%f|HX*M2#V zSb=?Z0>Q=(+I^*LFDW1VIlZ687g*~c$O($Lc;X(AO6PN_yEWVnp^TfiCnS(J=h57C zcorghk>_@-a2IeTZACMKyf-F%!?_KV zaiJm&bpnXY;W*3>Cb`>xZrmUeTjs9k>xs;{z_PEz{vZ;^i2C68)Ah-lu6%;Xa}OHF zNw7pd1Zo4gadBUBwh`I`H&1~R4vKA%=Ms2xg8BZplIQ*kW&C;TS@n zKqOP>aP`-1Ha7qS(Qw~={%>66O_hvJ^M{-7a#g_M$k|l`o9zUu5J;Lbx_006to}>R zC6{B`yYW3#XyqBVC~#e$ocR{;P-nb~)javiY%yL(An^-=?yZ#gQ6c+>@!C!$n7 zh#?tO7zACbsL~3uG~$AIFLMvsoToRY_ip)ign4FRr%Yk#@v0Nm8)ML8{dQ;!(p~66 zHRUYqCVzduF$TS5>E)So)sirhQ}#S;ac1D5HJ6e3KU$RQei_*apupyqB}`;lbeq7Yh~7Z;fS@JHL<%AH~!XRccgrPp}$ zM2fQOapOkeoD_2eu;R6WCvb0a3zl|?CmVC_I7_ssQRrtkGU&nL6cT}L@M9g-7PWp4 zt;H>ML_1^0Evo{DleKh6N#t#tBD>x`T6Ar(L?XRt`jxj_>qQW8;T@ET_w9D_#e6RD zG=TjO&Q~SzRMiHa{-41Upj!?^9QixS{AGzvX9jl9bJd|tHd#yJq0c6gznu#pL(DDM z$F=9KK-_n00h|#KH}LihHw;TZcVf2v9q8M%g~|fwiot~-SD>4;Sd<2Th#tdL0EQ99~Ge_$l)@*rr{YORm>>8U8tEI$6g{Khnc5Oh(&)j1+r{sE7 z$dJbf!diEsyT_@r7%6ec#!JnV&H__<4dDs<<=CvnqAEskz#f!BIFI7NnIJ2aHs2BS zGndN{!6$xef_mtSVH8Z-$Q7zcv-oCh0%oA^z3IFDio=Vd#@9Bpl81%kF{P-bo@DR^+Qpzd;AQzc(+A4hv!q?uCQ* znmqg^2JSRT^Le{Z*qjWjHik?Es0gv><5R_jm&>2EZ-Qf~MiND1Ia4JiF%A3dZTf^w zSn*BBafJhER#&NMbzdD_lkcN$Vk;8=A3fsN=ko7~Eexmd7K=#2li+=5W;2^yk=kCC zAT&S&L?Q2nNN@xf5e2^cGd<$GMh?mhn@<7qNP^AmJhkaLXL1L)T3F@t10w(_J?$Jo zqk{mjD}vBmzq5DZ-A{VNHcViY-PT}8mL_7x6|pJJsWJ)`R#D_0qd-7EyC__*-o-7V zf#KO{<7>TG%Y==)A|1fXKu|KVMj=3+DmN~*^K9Q-O`I0UTORQ!VF>07*Zq<;MC zE2?z?jFNi~(wuywI5tK$ih9CuqIcM79Pdf;!&E zL#;B8)8EV>(E1XG1i@LD5P@o@S6-%uR~2e=TX`h zJj+;rfcT!-(XJ0{4%8Dx(`5^U@kX$hF4)$VSOrhgipxj=3qTG&xC6t8OplWEuAnx% zK6yzw42)pS;%$;SwGbEZMe}g0h*&=iYfaEFQAjxSzEaadfnf{0ZYlV4|Lu3Ne}6m( z{-cS|KDb_hY%6x4foKx>B6Q;ZgI&Kd)(%T?a?7($;Qj}DZ{iMh|MvgC=RGsbjBQ3^ z-^MTuAxniwgRw8oNRp(X4M~!Ul4ckTS;iJ2JJ~8EB-L0dSqiNvNyyTIR8&{KZ*|qx z=l)#x{k=b*@9+5ij^p>e{{hG0nD^^-zRvS}J|9oUgHkKhKBg$4rtpWC+InXyPZTsL z@<9iVbwQqxMyf#vKZgd&3l+7)xV+P5kc6)TmcSD}h2SzcJK6Wj7_Hyt8B{d^J42DE z_SwylCq(+72S`VprnT23F&%iXxn@bDj^_zoa2r?d*()$!8jB2BQqg z8>VJhHDmWE4w-mu^E?~2211yx`*X2(mMG2xOxx`_4XH%`HGkaCBJv@jQF+}TT`8}v z=+bY7#yBEV0y5>Wk%Hm95DOughDL}} zpcE(jD4dzBF_*ec7{h1-0E9M(ToDyOH#e!3goTf;w`Q?LPy|RKJ8Xb6Q^HzPT*msH zsi%O2Pdfn_!kWT3usW>>khCV7nu)I4ljL*=J?cdrrT19^Fo1gokOs7wDB9+rJBgxb zsT?5jcV0+A;cyRmGIqJ_{g{cwr|r`8(gIE@YM zVQ))$pBN-iZ&xa zVC9{?(l>t*O@NsLSkKHClC}rJSUv;WvQeTS5NHkZRx;tf zT~#b3SlZlYvCVqPn!vGPP~o{=8HhqQh$qwp6v`4jk*8J}D^+njc~gGYj~G1iszVIy*W>ZyG5!EACz)%|l`PjCZ49!U_W^0a|o8R>;?71&k?Z z2BOv@35bOx6sw01#-})nB^prb00yA=1i|mr%Cv4tuYWWfL8Yh%XlN3X2bUi&(U7i%2^VIe5CbX~VfbPA zAtqd-zK4Yf?u1Db%#wmsllYXI2`gaca6Sf8nFkZ8n2(2HA4eMxzep0BfGaHYM8^Ov zC;`dTTv-az7&^Kk?QlZfB2sZ8USztJfm;>82b)n8Sut4x6RtXe@Nc=V@2Sj_@C&T7 zscus_vJQ@t<^o#61)4%EOnCMj6B$6j*tRA)lyW0!#%6o!&%g>%!@&A}CsZoqUWKw- zUAGN)J-egSx1FN|C7~DPhIAjJ%;eu7@w^SrZ#)i}&oQBSIXR1o*`W`yS$TG4f$QvT z@91|tMf}5{VHJS=`+ZAmL@**w6tH3@+7)Vv70p)_-u|04p|YxpC=bS_*cMv$%qZhZ zexJH-d<2lVH+gZP2?+GeQxEJ@X4+dJ#N>-OuiON(1&V9v%} zvWm8pgq%P~&a|xC&zD3xU)yEQRMiH7qz|~Ms_(k}wUs)Bn=Ugp5O6(;o&DY4*SQ15 zmL-G-r~tj{sJKVpZ{)#YN#R`t82qK3SE%TwW6@NSHt_y|hzPMgb=wDIK48#>qcsRsY{~>6tA)Q<9B& zJeC1?1=)CgOe!l0^;WmE$=r9#Mm{6GG^s7itD{Wy$WRE43Gg@6_Z&R%)`z^Wkb&hD zFfET_UGJ^uf0dsqKaMvADv$P@@iiqxx}`-OlY$H;6f-0k6CiEMfO0J;dnoZ-`*NV$XkP6ZB<%gu1zSvE0K`aw{S9+i3md!Rs%}3$n)Lv*C ziva{HJoah1NaHBwJK^V#W339=v~oZ`_4wOs)??7c46=3U$fDD<^OP0wx@VCaUsP0W zmWp}R%8T_Jl?8;cMw2a)mk{cxZ^F(zMYMx+cq6E+ZFP$bKO6&ZzRQ)oAWr$3x(SB* zV$reA!(G9QYZ7Er4@$Cn;a^T;b(TC_EDCm4QBNl$1;A|1SZR-z z#RYv)H5Gq7?SAiwk}@0eN&s~h=W9OKxSe`y^k}U5ej|zxA}KR*ZFK^auBuh3H~ZjQ z0o!*7I(T5Oq~H$N`|f+TM@}L=<#Rn77>ec0KP>TlZ2)So&nPaP(*ZPCf;x00R&L@EEKWOiwcse&;u|p~9DH8S zkLx_P5`|dns>cGl`LfCF^|B;Q;mR4q!VEayQlpr$I#V5{H!LB#?v~j;lE4;`4ATY_ z@q7rb2>jUFuINQ(zW+mAM4Ui`?IAGrQZax+UN{Uv30GL#8zM41bR7eg9lv4z5qh3f zu4o&^T3c~{2Jjq3yYdbg2Aqe@5knF@eeqMG7TUmbrV1qKkK^NqF;ND6Qrc9e^IKwu znIel#9@^$Z+dCNDN%sgA}ow)^yO zdYSr7mw-2EsljZVur}auC)s7K4HIp88Ma51>pZF3^L%2aNGM`Ja?5UGekX(b{zYYig;(Ys}y1L0+? zVN3))f*-+TX;76#oj&!YX{bxODpJ1&G626EjRMEs;*m3 zjWwxT4^?+QdwcBD)nTEF!ME*(<}yDuO*mXU_PBHCW83p|u#Rk%dgFrU#vGd7`$t!n=Qvu&Y8@@`d>e%A}(;|r|> z;cAYR{fKDRLL1q!I(AFfi1^ioo7xH0aeM7wN)ImFGPqlvaJ1{C{FjB>6yX|fwEZYi zX0hGcu_igaYgEN(@eVDaCiR^CnEJN=J-oE(|9g0;(U<<7gu2>u4sU$7eHnOix2~?f z`;GtcFN4Fv^$oWj-UeoUc{<@(-}t!u?UAcrp3NlGH@$LrckC!+DEvjaSeD%7!8ZMz z(~%kY<_J(r@js=JE2;Y}kbhsJ%2w{JF^92#c*F2&i1WJ)!k-33VZ1L3N~*LUF- zOqq9clo3ygG2d}j)nV2|AX+dY7@6SIZtz{7e6kW|%f>Yj;<&{ln`@U1%nGs=RCbnd zkmX&jlWQG>AW_IwySf!fYtf(}mjx7$u*6Wd=)#0Kig@m%|jJH8$Uy=pe`2O znq;jKqU@KqdU7=7`#jaz#ph=l_>sv!T~b@7>hGNKE-4$&^sAd3&-$m$fz-Lg@0$bV zD6fh9pK0KKYU5K~d?$-D_LNVSWSf=mIG6Vq)YQdxqP$XzznyUY*3#!eMScQMQQ6RV z#2Q4&>TbWl3$Hz6n(FRF+oyg_`gM)M*RV^N<$Y-Bfe1KSTd8wN0M3H6JaU5Ag-<{t=N!(F1}L0N?N?>mxuuE)?d zKSI6xE?A2hk-E7HPBH#Ch!~!4hke1!Uc4b5Z1H{&zH%uwz`;Vjzjv4+ zi+E>81nRTC`kSVAX+!J_>q>(-kHool>%J(HMYBpY(0qIS9y_jCp{q$xL*aq25$i$# zjKuEeehHbte^8`|O9^oKHi8l+Jrb}^Ve&@0bHHT)Pt%cmXQ{72Lv)mxaA!eM^O-r5 za@M=Ya1w3Z2NMP7Hj05{#kEebyXVmM%!nOC0+}D+HNufxp3tqYGg18Siv|u zfsa@LGk(L^5t93d^{z@g2Ga+0ZKJ4jR}r5SyQY)HyEzmr8%l{ej2;$P1Wjew+7VJS zo_g=*JZGSHnP%t#0-yn+N@>Y-d&Ul&BokqfPsN+^A_eG}8>qYuFg!(F;DwEX$y%(q zYd8TWW08p90X}7{1Q@L!Hj>t`)^`FI(J9GqV#P&;zVX%S0$X{m+-9FHcpl}Em-CVJ zKBfUMXRNh+>`QB0nc_~XB7jSK)N+x;B*=RAx9YBC3RLy(C?t0_hY^_OZ};&PTJr!- zf4hr^H-7JNc{6|u2;=kDz{wOD7geU!F2)XrqPwOAQcUm(0be*w>5}ZxJRC+?fA?z- z`2iPb9h+v1jXr-V9JsW`t8C7%c_(L+s5sQinL=liCm3gOhQBJ{aDm=#V^zd?(47IU zsA8hn01Dj@r$cOzzJi$HbHfn8AY+ukoEQ-AQ>pqz8i0$N8uJ0ef~kJvR3(HliaBy> zwd(*sb{*D$s;ijDgDvF*rYLv>?uaJatVndjN&yta`rb)LguHihbc+M~@hh{WsO0c*3MiabRoaSt8eEP(fQMk%J#!T&e2T z^4s)<5Tr?f9cpMJ>SFa!Gpu!Y)gcJWFiV8PKl16X`*ad2iv`ms%=l5?Dqb3&nVO_m+)J0p8yK5MpHFHI9h)=z^va307WHW5zL z@WA9F@PP~jWum(c-|DqdUU8L1OYlK)$7p zdh%zRs_y|BO^x!agKTOXQM+KEVcB(K@4Av>0otZQFqo?E`|w97GjCy*7h<@YIud>V z&hnOUyDMLFBQZJqkGV5Hs+uOT2cAPu59q-H;VIwMtVb% z|Aff|kC*-F_zKB1%pkFs9bf(EUq*)5@ohz^PNgcU8G$2vinCRM)k?t2{gb8Wgg_V{ zD!JU3xfS3sSrASY)31bMi8)b~5do~qCO&I45+2txUG=G(4gkk+6@Kns23tji00i@P z&4VL*H}e6jX>aO!&(2$e0E4lze)O9q74oYScnxE9DGaKSAf zo|+7fVj=-45$yg!Wc44kXQ1NngTc`HZTe08NSgl0V;sKsnV1ld2^@ak+t4o71r7fY z`B?_0at8JfEnz)*pI?a=+FhYY9pz#DIX<-%s@wyIm={&)D-GXhc5hp^HIDycsJTXZ z4&Qj^%i}ge;TKnbq3EFqo99J#=<l^_=|&ic~a~-=k4Ez{@Na_jjtm2f;CY z9e>eR4NMcvtPiTT#z>0rb^ki}nE|QySR0WGej#eUX6YfN4XaVAcI1*DLYT_#a;L05 zH4ybOpSVLE^CY=QofLEiJdTf&oxM!~nu>x7Uq-MspPSOL(T6FVB4%a-0ckcGiHfx;HHq^P3 z_-hbFD)K~R-wq+1&TT8o&H4cuwog)|Et$O!(LzU@OvFQu9(k>F zd2gVkwBY29{Y13#Syy5Q87wIZ2MV$gk>(roGm0as9)F6k56_70AdK8`jL!XDz{>QJ%R{`R>+P{#%vA_PsTF^om2@J5-c)N z%3*aZ-joB?)MNkVVmskI8rH0nHrn&{VkWM;lz+&xEOX+P?L!iep zBj0l6d8e~I&@R+~UBJPqWq0tY#M<_gI z1H;4Pua@<|HUwa%^~JemMn6W3)jU|WtOxe2Nr3dgt1cXe^uQO_JcU$&q1`tW{eR>W<~$Z=(kXvno-_dIfA?N7o$Hv*dk>Z8?A2q7o$JhQ_4>CwnRzw zPe%WmyVV==QAL}-SzEvMDdBP+$ScTWS=4oX$4n#vnDBhNZQvWv2tk{Th#44QPY5|J zxVu!>26`p~0C6~lyv670dE;;Zv<6r1HPqB*&M8@9c`*5dc5a__4=G^*zN(L%UOA3> z5|GNudr#M%%(plcRH3XVyL`j;uRG|;+*EnT;nrp(KiJN5Jl5YGn9v7@GhnZ}?%Yi` zj06Fi)7=4^d*ShBFysWD#t8!?j6Wm6;&;cP}s=k6L5b(bw`C0bfztPT6LAzxDMfMD#}P z_3hXM6XZGVgjt}I)sim5iqDB{KNHqw79%Tosnk+V&8gywQ=#*@otwI+yb9DepTApU z14!C!x#o7SDr$G-t~IKF%jrjTL{g<}K!tlsOYW5cF;(wtHkfxEcO%84DniEg5!IUQ znx$Pxhw|WZ<8`UVZG0k!I2t5mf$L5Ay6oi_YKABh#1DIccOty4Rt|J#UMkmL42LM@ z(TC4>)_!=Z;(MSVvVO&Rp*rO=YW_z%2Zu6Ms;-~+rT~9E5UT(!;2_N5=h(x#iqLGw z_ut8K5hGGFe&RU#lZq)>tAD~_EDYinf7A&XVyJo1i&80A&6Bn>-^U(038LCI^mFti zBHC4bmnRNZ7y!@?#rQs2rVSS3RpOYmJbz5^rnR2ZtimwC;Ru%tFIqYA;-YzG%w&g@ zc2r(%{Q)zjd`l^*D(~XKw&e%n6&uD&%Pg*7=p}3%#g>Mt{lmDi?#&=x;vB6yqJjx2 zu+{B#&xmFq@&lHABc6(@u07V^(_lE>XWRLg`!J8}d;f0ufZdXrvX3ayK3Y=9xM=qa z2{v;bO?cytun~u3j6*ov=5?Dnqh}99=~lmO20Gy(+F*km*&e8 zkzB;JP(i;;GF6}46`N0mWMs}}3!`Z=fd${Q640j^j;M}|U8jBaczBkSLE(POV~>nd zwSRgb{uE69S7VPOQGZ%^Kxm|b6qXxNc`17tEom5l`7Q)$&H*28e;~Pi&N=(-XQVg4@ z^PUPA#0jEou_d9m0CS3A-AadSn`Y%0$(?XoX}MNN;8U9zf0X4eT2k%eva}Lvn&J)Bf!^Zp!GxRD z;}KigeU%;Gfl2z0B!NBS_p6{$;P$JlZ!`7%mI<5^=eW?Uf9?6@QDB_ea8*;$?vYZv za48k3ybq9w_@taV22e{iy`(OI?(&ivdC?|NCL0heUNd>0p%9OIqP9sT!a6ziV`;zk zNVJ!DobT(PwNuY|N#(9irF6;g9f)$z{-}1P7?SDA?3X+z=C$Ta`>fQ}EHQX}fzMJgqV);WnH+YI2Nno;QRkrd1)@#Ra8sOli?D@0alcteQK@ zSq!jaAIw_!ag>3$k1|W<*3r>q`+|~P&?wMGB3jlK8U^~$7nPy>ke{PK=uC|N(2L#q|Yb#Kd(ODvh3>|+miU|4)v1wy1K3V zF6@LhEkNRo`s=Ejp0oC<^$MGjQ~;y8QkA{Qq${>aq>_A7sP-Jss%p(Cu)BbKKmHfW)}KRspaW8zBl- z&ODaDXf0&@%C`X`nV0hw19D4o<`{K0nTJ!owUCD4=R2JrXApRJXM(ZgnkY*8Jh{mE z07@G}GFO?zlT6%2i;`*TyCX<+mzW0tNbnguZ7QZnkv0m1KF+_rgZ?%>qvIhdRn~`` ztE)jDDmd01)3rlWLH|0wKnvK$621(s)|MY~wg(LOQ725DLKNe!f`&vE+)avZyQgEd!R~?ER`ts|0{htdHGQj`q z7iP;zRQQMA8G>k+jI>{OC6g^4<^Ax73| zD3>a}Jn2>`gC1>b|EvA&E|tR&)Q{%0Cw2KE%%qj0&!s>Y;j8SwCf$EFGSVaDD9}f> zAm+38-a?ZO^kgDHCh$lpd&+(Mt(&f>#fu>bOjKN$?^Ido_i8SE%ceq)&rBPrBnlJM z|E7`g%R$IqeRjUXOVt-JTb;GNtj}ei=I#tp8t-zS4u%!_)Fj%cLH^G=jDX&U&@~9n zQK3!-K&=O?V3O7WsXRNl5LjBx#F&K}Vt_nE9xp!{gejwt!-5g?^kG2KV)k}1-B-m) zgMff0d3yo&2#WBV(BOZr#(yt86_6AH>7tB)Wb5Qs40tvVTme=MZ-Ft4CEb6$J%OmO zMFLMIJ$NDO$NfmcR8bjBgNcym z`Eg?a=z~P9gTjUI2Ia#%Rv}8>*gGJ}obvKn`E%z0`>k(o|A9CXZc?r;SWfZz-Fyp?2*U9jf1z_a zvTarX7Pf1C%#t8Y>_!h;sh`V6-y|47vxi&?zoT8v;Rh^3AoFcy|0QU9g+29M6MIoO z{yScBwFJ%U)Ut$zxoX{ToBs070iLLyy)2>Gwd#*20?X7i=jQ+~W*IMO@=z4HY`#tL z&&%=XcJqfMG(NGS76C_I4>oKYly5Nl@2B{j{ab3){{s>ljXG$Sq^-N!?O(itbM&`B zMStsXoX2NquKGjt^!*oGh8;mRH^`j$H@}#4(ck`JHt>IdGD^(?*>-)w6~vP(xTKuM{c$E`L$id+80EDc5QLf<)e{|c1qAG(bHEO+VO zHYe^)JMph(jVvZbK}B<&q*uz9|5$o{oKExQ(-~X_ozC5rP0M&|sWp9hE+8T@`G@p++B|hPfN`<@4$1$^L#!mtXeKY#sX1Hv;>iY$)I5 z*77FXtR2e}0S-y)Ducr`(-{60v_=k&A`awf9hME|Giy)6sxl#3Rc|6)7Uz)}QYOT- z(-G;z8_p!PorMq5KHKR1Pm%l0_4=>B#z2OFG4#AyLjHqqF^mM_GE+ zfA+9ksE0i%mc$ERDSEDj#oFG&NT38hWCE!OpIt6Ew$o^my~|C{6q=bu4A#!lhqTE= z!)YwdU3`rhNd5X`EW?ac&61f*`cKt#e^=yepFrWNHN}PDP`GMHs`xsel9L{~vFEb? zX|^&|A-?_yx*|KbW8KQ^+#&T>C5_k7OwiyXG+Vi?$Wp7``Mr^S68o#jbxNx~IwHjb z`ppb^HGf;=GO3iNx2)wN2Q{+S#tl26B6s{20ft2QJxjqB`BVjYX$d<0Y-FK3t{Kn+ z;LsZmK#2fi!O~-d2PB|Si*6wK+dcT#k$?&z1)x;rnMN1_9N6J1#b%_ik~-%Jts~qD z|D$p>(+O7BU=$zcHm(W`Z_|(6ZF-uY{_BMOPcO3Ei~PIYZ{mOGeittDBHCtw7vk9bfm10@O9AO_vxn!fcO-6Rqej7_qTpDc0` zWf#0mrkeQdb`qoYDVy4ROcv8^!_>x|HU#UBpRv(ou+Mnc**uW(zxCgnEPm%Kr%FS? zC~htT6M{DEGM|ENVZIaObguf(UZn1OVp`abr3$^Y?$K8D3s>%L^}QG}htW6-*C0?L zTA>i*gJ-p5RFMD*3VgczE5x{JYl~(kfS5U-4(Vn7VX}B@<-4YND8$%ieCW8x_0NG4 zZvg82zMLvh!mn!2yby)g{0J!pYZhGj%BStGJ_hOq9@ykGdq zg9T<0VhSD_8NDwo!{ubc+$EiO)+~}kj(vzOzB7%q?YgYt`<>nK`m4sB8}vNy(SPBW zO*g4;AHb>graDHO#b?$kKP*?g2%bHbwsP}Ddhm}%mn?h5H-C9h?o#LW^2l!6 zdjHmjfXMNi1M}wxuWbE;kMC)EfMwIk8!EzAgZ*CCB;K=hl&q_sba)X%{!~1R5AH2M0>Tm39o%wej}o!^wqjCq=M1XLUOSwc;^&_Z*ps# zR(zlhA<8uzYMEojA<4*B@@T5_Ba2<+bQ&=N(B$>Bq%#u4BLuX_^szJEM}o#k>6HYg zV!2cw=Zw!IpL6D0z=ti$M?X%U^9}K+d6ml+mv+lLPTU0%ZPgC0rhwnvS?q z;OlnbhIl8V>S|_3d3BdO$FKa-o`Ki32ooc}+D@m6^CurgwM~%@Z~fdO8dM#EPQ|Tn z!8Y1gU+H&AMKQG+gwGDrn&$j3zqyV-JeXv6BxV|WC8yUet9gZ~;l=B(=ccR7zsY}8 zRtZ8s#Wo*Sl%=;y?|l?tfzeMbHh&$}^!B!hk?gFelkRREbIFxr7n8(h=@)^8BUB}G z)TTL9!{@b!W4etutmeNvU!FDBCvv{&fsjc4)1FSS&3;Qy_GQmDMN21;12DANtMC@5 z?Dg&%Zvy#o;I5Fh4SoV#bA(%JS5Swe-iH?P4Yo_&*oQ9lr{9#IHwioQ+*bvvXiolT;j<-V6WW)n20`Hot)ZEc4l4OQ)oTLHVKHD>01 z_r1(>0R|QKRDT|Y-;2uogBXCye@hNR@lJ^D2=Yh3uj?o3*R^2KDqVTuQB8SFQkjQk z0V5_F@446BkZNAUTpLaE!l&{gK2BJ~tl~ND3Wfq&MjrCPYG1flbtX4*syKGQDuKjy zDf7G@=KaZ=CnpcuB+MbTj>Y@o!50YCr7D-~SEdNj^F}Pdori$s@s!2rjFut-dwvaj z|GC2U$IQUmi*MpMJ{*buISShTna5Vm~j=I@lVi)nU`(LVIS6t&p-Sf+s=$!xx`Z(Byro1Vjl z!)OAUe6>xH!&C7hIsfLF& zX^6)-lgpd6SkaoPbG0DHM`Muk?0No5p#u~7pGVxxR(KHoKnloj<~I1z7;Uxjvwv?L z5&KBRsz&OJX~>tG4w;%Pudyi)iwDzKWBi)S8QU<7X_-9q(w2(!GoZjaqBdM9c(t6~ zl!2Q4NRqHV^Y9|Wa-HA>_(e-!OU>%IG;laBJAb#R=fQ_2p_%6wXc>CKHJ#e-5{U^x z+cn3lx#_am(lQB_yPjzzAMF}d*FV#KxZg7cWxQKr+hS+a!J6GcuXk%_Ew1$vc4eh# zWJTmGE_M0{Kh7+ZmC?U(rQ_hxp7gZPS0TKi|(2zFcbMFy)l>`9Yo|x_nFbl*`r6533R`SMGI~ zc3U~OXUpAQGUvFaY5J`yo^V~2(7tIenJ-Vyx~!>5?|!{!*{`%`&4p8Xu~LLe+%Lb< z@%wk;E}9FP{_-m+6umwC>B_Sillo&;l`=sglXf7b3ua7J{g>=ZcvJtkTf6N;U9X6Gc=bKhbo4s$%#@5S6or9b!f- z;M^^(4Q2yTNM^*>qwEFG?eug}A_0(-G{7r@tH|;nQcceybdONOJ_Sa)O3FJv(UNJv zGxHp8<*$Nq5qbGKtJ-zOm38;O57Wx9-Ty>>7z9roL=P0Y1#zVKs$^d;wM675;bnSQ z?XPT%TQ_bnUv*H@6Hb8Z8F1cO9mq9^I-MWhVM_JOz`Y`#6r{%hKujMJuR9v7mjXFY z`EpUQ>x0A7serJet&O*sI6m@&3MYG32O23T(_qkEoXFEE88dfghOd2$PvveB9u{pY zJ@rfn4idmTp8G{sC@{RKvKjz+{7mvH>Adh}RA?aumJ<;nO{48=KSeyml5~c{^I#=y z@so<%2MlC(0)Rn7yktARkO7lhNH~2EEwMYCrVGHTU?~rD6o*d{UvkABuyO!XAVwY) zBW)lF8?Kc$FyLb@=qSZRsiGkGiz#H*f8FQwJUHB7i59P@0|P0hV)*1&I>ryuU}dh- z=>UuyEPW@#$o3#wh=+ZFlC~;zSLH-lI2j1RKsY7o{-!Xz=P4cKRhsD3`v=iJ1YoWq zvdlB_B1|jBTgr)+DwhQJkUR{dz$ZRMq!Yk9-r**rY5FP9%U&ta=5+51Et@ma7s-I? zqBP|o+J!0s1Aq@o(vAj7;>v3b@3SO^ZG4Iub&~j$Rzz(?-aw+l$x(WL)ul@=?$9yup zG=q$+#hMr=?K5XL#jIh(Y_QJy7^0PX#!ZaJ(EBV`uLjKZV^8o@7R*)+k-^VLH)SRj zD8DQ!zfv{sUmbe(J}*vy3y5Nq{Ms_3~{uLEqD zq`c43t}o;K&S-xq$T^8Ay`Qg5VuUBTS$(j<3Gg!QSQUc39z`#T!#8mRO##ciRiDpU z;!L+6XwM&dxpo^%>r{Vgp?3ZSOpcIFMZb@m!6lTQ8tzRo@=R~o;i!Vc%D5ywV~N|? z9H#bG;DVqjJc6(>H%4pmeI<*UKehsdTfz>IVYe?cyy5wpzI*R~mYp3rl{OJftlE7) zMrzA|iO~eM)iySl1=IhOE>gOQ1|shaun=5$e7~W2M0k6&8x72+B=I3>>F@wxwU>1y zJR6=Rm(GO=y{NEV(y0(xM8PQ+>y!Y@3^s;yDZLp6r-2GGqHTJZ&91BVkN_nB_9i;i z$qsO1Xm<~+MN$&JAj`L1ImdM^&c&S5k&&N;XlKJP*+%^Kt7*E7i|qT@nooJSX7rjb zQa}%^Y#mOC0K~WJ754C@EXEq6!7lRU!)id?6Ra#F3mk^|#D)s7s}0`6RIGuyh#C(A z_^cUw=NI{GC4E>PaONi7O#pPYk#OT)7MPAUSeGM(1H^erw6crq#O&o7QU#|9v9X~S zlyOE`In_mcXBT7nY4F0qum#;3-~KCOrmI>qOQfFQwuW;J$cX%!dO4UO)|9`!J@st0 z%i$%p+7F_3cZ>@7)Bse^<-(PK=mVA_rGCO}wV67gG8wJJ09Y#lT9w|rGkRF;?tRTo z1233&3_yNuK)%9B*$q}R&Axw}#U}+51Y(3*&-7I=?N6P|?}I&Dhr|17u|kU_!ZVO-J6^ zm20uph@dP=KK?ul^%cE z75pY!T>8$A5MG5Miyzw@r`3h6)&LGM`A6XVqdPm!J;mPo+F7P?)+e(jeZ@_w{Lbt4 zpd5$)5T)zGrWn!#zO;}o56KhmYJmSt$F^Y@ZYEY*4Z)aciSEQUyKngLp06r`ztO$p zj$hXS0@69JtK9zH_0W5OTo1Uu2eG|}??eykY!BvIkKnT&;Xit?a=o8kv#bPVPw@C9 zHF1*hy}<=i45WK-^dnqjabEA->nMkgw7Gq0i^o z-p6N{J-r~;W)k8$a}#9t-}gQL2)_&P;_?Tq?=!mAyUVao8Y9=5qBr~yO9!$TCH7e+F*~8@LX{7A;e6+prDw}_&uyl~CsrN2tmm>cV2DXMt0`^0uP8>q z0JDS3_u-1i%qIpD>RQn;Bq%Tr`6f(|xw{&(6;lo?QPAGf~MAMn@*ZYdTo>eTo z*1krt+g+@(({e?^a3Av0Qj$~Lvlk+POkLX%MJeXB zn31lE0gZ1XJue!y<&$T@D!p&FGETfa@HBee&`XnVFDde)W+tOlk5S98QR|#h+v}tD zL!*x0Mrrb6P9|f{9%C+HW3D-4Zr8`$hsHdX>}XVGl)H%(D|FJAHfj_5`7x9E)9AlA93Ly{Y?FI^e>@ zm+)6ylgU(%$wIW4bPEx*=z}@%nVr(De0h(>(dtEhewqJYL@ld)=P%y5sumxV7zF2`cBthVLa1 z<4xX(Cl5a|Aw_ffgtOjIyo#gVzA+ma8S!|#Q>$t`=k3(>x37oZzWw%gM*iKL$-8-v zcOS#vE#$oWeEr?mp?BZDy#o|xzzs8q9W#6V;K&u4^}X0Qsgq8n!MJ7&dC z&PwLaO5d23eLgFri!pvPi_hREY0jyfoFnJXso$8>cs{4KG^efbUbk|?`_((%uRZzR zAou;c8}E&uzc*QWPf?gR+b~bvF>iTt-a2>Q_Qt&Z^LfXmd78oprwt#RcYJU;`N48W zSYpD55Y8L-lQKH^Q#*2H#z#Nw6p{HHX_y@Lv6S_8n)=G`qW8*gA0NtpV(Wbx_5XD2 z#;4HdpTd?tF%=fVH!QGsEJU4L;N&jE-dKoxzL2oAz*SgG-msXuWAXIK#f;p=%o~e# z9?sh~Ebh6tDCaBvyIS}60jAZzI=~G4y8))d{|qqyW`HSRQxikX3J9e6WH9DN5{!?D z?A!Tnq(@^1+K$){Vg$h^##ow5!nm2Bj_mAcI^zhHtDIa#peU82 ziJWxLy2%nNxDC2h5|- zOs$M)ypTC{v5hFHalTc&;x+U3T!(s5r=<3nyS58 zYkO+yU_WWfX|(T3-z^!}@~csZ7$BFEtZe(#W2&b<+sF4YX=cw_+vYiyIH}8Wo?u6- zpo6ZB?Xz$D&hSJPn;u+|E|lrJ@5e4jNtN?WAy`*3kj{{$%Lm1O;WR1^ zuCY~6oHd%eCz$4*L~(Imgo0d4U(;?2R(Ekb?YGZyd@Ms*{Yr`Lf^_jgaD7b=e)kD@ zsajhe8(8T)`T>5Y#mLbnXkSnX!DnVM(+1hj=UUYByKR*6Z%V?sSc01n!0=s3$K<>IGh% z-C(rO-lwRCixKf0s=c8ZO}+U*7~Om!U+~Ud8vd2M-xlc>qoNDA@w+d$coFD-3e}Q( z8UrLzMKP*^LTZ#c#3m4Pwmn21M@rQjy^7fzU3<*prKnGpWGRvKI{wBt{NpI-rmSwRWzW#Pl8yOL@9E#K{!Z*UlEfDl(y*9q$uZIl=5a zjt!7(5I%3+B|U;%Idw6zq?3cUPq`J1S43}PawMCMa%4=1=&i0pedEB@SY9)KT&;2l zfyEcq)|?oIGV4)k#}W`DG0Ny&=rmEi51O+n4)2N7DgznzZWbyk)I&;P&N`-{NQlaP zVeWsw{R6DTxPLJ0D zlzmB4dK;8&Et0w^+<%3hvv$6bkF9#vX-offnQ~`|BhH-~iYoSp2Oa2#uIzIBP$3%P zW7(o@a&-5@va&1r)SVObs>Z`aulRPi?t$78{}1Pb|8Q_0%XB!E{oz80P^JGz3~o!3 zZ^_|@e-L+5${jD?r(X56xvPpI9 zCJir%yy2Uq1k+RBflE(ri8LOJ*SAk6(P$Rhod?WYNZg_U?IBIZJqx`?Dhx1AWmmojeKkLzx0amuTDP}r8uL1H3>Ij9GTr!A~b7 zL+_eaU5y@Cv)d?3zeWZra_Eheq{)|oVtP9Ej3_fI$Vlngx7p))vf6$T-gv=@kCL`? z`$a=O>%P#fXC=!e`EO(jzxmeFoUM8Q_Mth>7R>@&*LNnfnL|r4M{hjS^DB8e^F+>b{Kjz@?vPyQn7B1NG!NBdP+U7l(ONP8aa+r?LXcn=e$-Z@ihkR75 z&AtbYHuZ<@%ADE}dJ52{*kdx1W9}QTe|2n;S~Gm`(Bf0Ap;Lw_4ut`*u27=J-gcqO z0YM*nC;$N~vEOw)bAN>;3_F5Oqbi!lEed++_$WY({JuQU>R5_%6kAYdpe-6TNh5}MKtRYXv_h@hb( zp!8l09T61}k!~m|ASxg#DmWmh*s%^G${TdXac1B5-p}60@w~r0`yaRngmrz(I?vCk z9{{BV^ton2UaXDb=bE)L9!K9kRoEj6r$WwjQz|&Ej$5Yf6~Uu!X&PpsfFH9B&31G< z-ZnY_Iv!+0l>@Cp*6Ux2Y=i)u9%&Oh%-eYM>$e8Zw~-UyjM#ANFAJ3(B@!+o9 zY}@pbYd(r`_sFVrMDu)fDnb;pCCXBoE-U0aCP>$rL)RtiRG89#_Y7|hi5rmzdcWIe zIZ)cKqJ2{0#GywANk>0Ks!3$oFI1TXq19xIB4>m!B0ljLudoL#VRHj$dBU!Teh~<* z_?_=V0f6YHCh$NL%}m)Pk->wCi4e1JE9w0Z8th(G;(Gt)x}8v72+FJ89=aTX6v7}< z;w6jJ=W~P5wrbKJ(T}|X96&JBFG5){_-MU_V2X~-Fd9ODIKwca+60$riI-&dY1t$Z zdxA7>+i&a1bc=pSE9t10e+*beC!?Ju0iauucBY6&{AEhOOb zu}n0;;V>ObMupiaE%OF;4aY6wGz%Gs0YRv(HY|oo!L}fN`xMmQX2zSH+7y;H8YQ7- z3t)TH*izKnhxHXEOjz7V(u!>*At5pZ(x8ojj|a^r!w@=Z8q`dl?98{?lGSv`x|2|$ zlXE&VcJnSZ_N)V!!?PnMAb`l)=I{@01+KWPPk10l3)rb3`TFEzb%PCn2xuZiJ}u`>+&&XItwDNmWj~b3uFY4D?hnvh2^Wb2T-n8wNX^lE$$3N~7zYVx&3e?a z0`)*DUA+(l`m&#FCn3X{E3puy)B=-PEQwA24bU?+;1zljH1Jd$Xosq-x>^_>=ilSgxnTT!1b0*P8ql<#(un5Ef?*m zYf&rJRefNong>&(AFw}+i0s9S$7CV>lreq*bur_}sBy^kQ;0l19qwVY5WoyZ5~1{Z zeS56dE#zU{q}i=C>LvAbbS<5zbL4rw$OJNF{XUvPtxHf2+iO~}8=!n$>fj}8hgho* z1_PoUc(??)FRh*{4!L&}*-+Bh@EqOv9DQuHe!9Kxo@a(aWeAl~aiJj=oprLPUk%|M zz{!O2I~d?P?1gkOXk5r+Xr*O!FzS{MT-I1JxLi=a#82L~KC$xL+x@`}N_pc*UL4>h z)QNaTiSX%f`mDj@Y5Kf%XEn}#ik~_?dge~bp}iONpJ{~Z%5QN@IZN<9VYv_uT_|-j zJ$*k-v2Ygw9xdWc4ZYCcL>s@+Mj>_pA=!?AGnifv*s_qxs-ri*EOIbX?khWy|NaA`ZW zCssMV&FVqhjxTLgu?u#37aUwK>^ywIsq}(N_XW2H7d*aPpoz76>9zZ~w)-7!_b+V^ z=xz^u(7yjmd$8EWP`!)ct`{Q@UyLff7~Op_CcV($!9^~aEnGuqhT^t3!8$OZn%mxA zOy$%Pp0X@3I?MEIJ}%brDq*kvu1*n|&K^=nNhuEgrE@!9SJfts8rQCd(yqqtuBHcF zXTNkci*>i^b+@^8w;%5ADDCd*?(TWe-S?%NDb_Qf*E8hWbLDW)aB0tIchA^^o*Q3! z#>IMB>!c~y-aChTr%QY9clXXb=zaL5cWzy*&%gVCKfVt&(D9_S&-V2B=MVZ`f9YEm zyYx=)(g)W|pAKJIDZRAXeQE8%rEgy@0dXc&p9yzkvc)h_WlWA9Cf5v;XN`##@5k!* z^Skv6#`Fu9^^5lOi_i2+uJz-@2W0dIscn6g11?6y;9NN7d+4zP$m-CW4C|p%A2UR(4MyNva8WO zS7TcdQik3>9Os=RRHhA!QRTXOmo zOP8Ldr}`t!yGZj#Hs*gBm2;Spr3=E3Jjq3(8RPhg=*Wf-VZZ1f|1$Ea0*DnLvNK@- zCB=l$7jfjoYTOA6dk7P+FQjrpIh36#9$#o7{&K1RdM*7gM#K-t%Hi)SaaMHkKUhMt ze@h?um#k}oH%r%lzV7-@KRhda;MZ)?Hdb`;cR&1vA85?kAAb1np;|0m|Ars_57sry z4}bCO>>rW18@m2KSl1g~evh&5XiQnl|K{KCN46-Z)Q+Bxw+kDr>+g}cf76cr&*Y56 zyE28;oGe~`f6{I`(_F@!XA>$sp2G^ojNgsP2w_iR{$=Y6*Dg$8XNUBQ^W{wc;a%Cp z(LCgq8Dokhn-kGB$A@Z}k9Io{!Dy-(rSrBR9~D}g=j2kGj3D@JnE5KU%EZpa2|X#6 z5b+!mQZ}%wEB3!~3?pDN7Kdd=<0fj$Vq6lh3M!GLi4t2r?fvgCB9y1)tKC9t8yN~0 zZ1GJMH(1%C|B4ZT>rGRsKBM*mFJCSGNTvGhj(x8#O#j`Bdezx(7tnfXzTce{w@`?F zes+@(fDJjG>+$G1EXPVif58&-B2|`|aG}8Ee$?*62L@(T$C@Kqm#6^48&)59xsjrR z?uFtQ>R0Z3guDy4IkHV7GSdy30$x|>&t}2yJ!=hrou+?2oL40@EFAOR^TiFGUnTXI zSZ@LZOFIuxS^xrymLFs2QeYA#hb1wXs1$KZha8m?q_IPyux3ajdaQ}NG{z`TFAL!fNGxaqr$lIO1i`?tyxHqHn$XphvX7X;b86#N{^NYwmYu*j5 z;E)K9NJP#2SYqKhf`{DF^;55s^M=jJIFQh-q%5++$ZbIZ{Ii;!0dDlgT!$SW7vdfL z*l){Hs2a5ev}gxotSbYa0@B-rpOlFClHd~f790^9c;^&GVs}m35b^+xl@e`m0lCEZ z&ei+(wAjDw**sfD<*Q?y8|y5GFDlmu^qu~f*pw!-BRuJN`OBiNOQ#H!_u*S_d}jyz zRQS%YLN`OorVvc7mLsma0Br1|QRkD1_&Ho_QZy98m0$b2gIrQ_${_(^ghIZEN zHUP5YWYIW*CE#R7+6c^(vLlntY1yWzN(X**Bx_Lk>5=-YerkXu8X%(SVpNLC90Xh@ zlUPQAxPIa>ES(GBAKwFWlhtyWV0^@EoSb88hw}L8h-dwHxsAU#^xs>p{*5^<&P1)D zGU`vz(m#sm0SicTs@?c^66a{!vn!mH6!((R$v*-kIC7ploc#{u+j;74qwn`3`pSeS zuf{IodlB_k8ZG}}j*GYfSzgM%%iJiUYv@-bQNT#_vg&MQp&`Xx3r=;?@-PRsrc1_Z zyf$twN7UWuaPis~f6n|`#Vj=sAK#9=Qg=LL8;dV3@kCNv|KAqTKdn}+|98!C|H_~I z?Wybkxj*>_R7U5?E|%@H?u1d_Az z5*6$J%>BSy;e~iEXpR2S3q96;KG|^Evi^^pb;-*<%rt=?y^t@*9wU6K^W7i4PzIx^ zp!Yi_++T@32F}X;7)(9(sfK^sMlUIQxG5x#13$9SO9p0f&~=XMuwoaZY5uolY<4>Y zWko!@+sx-7ukFfsF)ean;o)^x&!7ighyT-F=+CdQ>Hp8K@d@JULMHLQWi!9C;>uzJ zeXhz3p!{m}X=9zkA7Nm-z7GRgG*Jr#pP(F+c48m}no9%0>@q_p0;&pS+7{j<0?_sS zfN$o$oGk~5LfsC*4X9FZ?whdBk9)tt&Qdg2)cUc?7^{PlUQ zfDohu&S1Iq#BPYY4Uf~3w{c2saVzqyx*RXU<{nri59>e9*&i5X%)UrUt+pu9FADV~ z#T9yu!bcQGYHc;VPV;^hkhW*6#KC!wYp4){qhfth828pw_b5?!=?q#hTIM0!r#*15l!QLM7Rm>lcRc|BfI3 zv+)C6gxmwi|BWT`A!&#$Z2almf&8V)cn-xfbOI1sMOL!L3@p}do%&f@~HAM=KWMS)A`-a3UhVzs9JcT&LQ@Iss&l{V5 zxT)&@)@$L8k8Wakf79KVH)H}CPLiizwvPRsCGun5pvDJze4jTS9@)1sZ{(ltv`+hi z>R$fSP4!2wwY7WyrJ1jsf6N=Ou&4V5Dg;%~T~OQ{VermJ(%Wzb{M7TylLn#e;?UG< zZ^OgUZBK?LkL^<*oiu1hU7HXXyLyGN?LQuhjmAg^WCOD>b~*`|YqL&ooDC^CQ&JVq z2%Z|^tyEEiSB6xk+DdTSsiUwp{g#CmE)Lr2*D?(GV9;M%kxi^Ni*+7QdaQRBJowaH zZ5*6iMk^{9X9T2f;P|IKWlYk6@(y@4##0oXr*MPaGy5jWMwr(y@g3filmYu}_48zX zKeB&5&wAr|gvPmsKc6=!heOH0=R9TTcmXkvu}A$_`9v@M#I8gt%l9jXe1w4ncuB=6 zAq-nLK9GedWNj%JJ1;02WytgQpYSI|hyWm|EDZ+-(64NW!8IU&VmzQ=xJX$$j6n=Y zjn{r|M*(>tYFy*FB{#7U`nO;E&+gKY)wxl_%o$91DUhLoN5hTcoQW#R{%EU#BrcPT z0smllLkchp^y$EJ0t>Ni(43qlyU`?e5_E15^Rub@>CpUtdZodiOSd^mKE5t0kk);u zBdaf6X8X6E!|g>xOqtfR-mh&%TaQD$e#L7+X_gsTSMdMvC&!W?#&VDipfSnYqHEd@{#Q3TlWg!-0Y&aV^IeDs^ePrTMo_M7Ncb9XRC z54aGHATZsw2VM(ugTYx_`vu)&XFHy?zj*!kcgiNnYQ-MbJEd5Rjs{^@_w}FpwuuOq zB$rhO?$)AO!e1rnwnXGnCl$JcY_=gu5#jn0UD$MS33y78czGwi`Lu@7udTpe?SwX{ z1i>(iv{W6?nmQL|o}Ow_J(LO%L~hpHvkZh03|>x4pcdO{e2O>U6eOmiIuWK7f6)*B zDAzyA{ub7uYS2t$olMXUgyD17Qcb~?jc0Hlvjp$*&?qyuD<&?$Z4^es&}FzG^pUs} zyI)%3zdn}whKe2rm?)6hDh_uX=ab(eOFSNJPnMAqtm1$QZ%LahJWdC0%2B~n!ho*! zb0YoU6Zt>(Oamu=`KfvLf9@CM#z<0$zhJ|BmhK8d0hvAZk`gwVQ@JL%3RtdPK(MFi zLuEsh7${+Osc-&^JA-2mj$~W;$q(jOQ_OEmvyv>T@|-AJIP#n$KWAfDY9%` zc)-~s`$sl0@-jk)&mHk--PAJ7@=X7&%5N%@k3bLy^Y1)F5J4Dwf6&En2!ZJKG)GLn z!?5w6C-PkDv)9+$FMSI@vI1by7{bA;l0DCu(Be(3T)$0$62(|cRgRlmyz&b+D)Rx^HG5BznAScQ_wA`rl(0L=mj=Z{ayZ&T5S6v@i+ z14Atov_YK%)NYo9P}xttDxB;Qy@uFUApq@JX6gIj6r;GS1{$NkY&V^UL1oBaS>qz#9?z!?#a2TlM{}fk{-lsKfy0Lg^d&0S@21b0`3BI!(y%rcRVbIy7QQ0^n$NW zTE1JskHzM&P@aD$t2)MSRL2H5r6f4b_^OanxilOX^53eCk-Fpf!VGe4eW{wK)TvV4 zV?R6Ys-I_Z0}Aa_KC-FG_gfmiAsw~Pzxm2P&*HwIitjtkMvwF#JI#v^?|k2BQq{_y z=XC$0I=<;!Q!^%BLR4`s$1Jg69?bWj)0R&|InnekWMX%4WYi8TiI{4anAz;0#?v7Y zVQ7b|S8tzkRUf%U3Pz3Is^m=VR@wgZ-}Z0qtl58PXH`(h00>j@k#Jld+5^6f@+=i$ zXz#O2xWsNSjE_n8+ZLh%n&$WBUCG2j78(4ZT=X;~Bu08~2t_ng^fuZ#&(`~IuZ}<4 zZ(Fb#!hkbqq_{k|s2pl8o0L$a;*cnDBiSm`ESS`z7L0`q zAnFheRF)PN1}*mhx3Ott#$YZ8y`d61?AQP22mjy0{68+NxM}eZ2-M%k=M~2Uz|cnh z#hYU$9jTqK3{Fd&kLOUz!!xl*%WV@BHwhNTA3NG>Ym~xjbp@ofweXACPM?F>bF6k= zNClQ#S>tncgZkrq*^S8=4}r?Ft}0m37hyHVMn(SnH-_d5(o7lKy8jN0WT)=NB^|cD zHbcQvu0H(;$Mc4of}dc-ABDA?b(p1tEH+gXKWtQF4b4@XDoVbwP&`9|`+jY8{}`H~ ze+HoDIYnOscI^kcf%K!b2)qGBVvkMCz zE95ug%ko$M^D^}RU6A_!1icES(H7}f|2a$_nP-|N^#3|c3-SD8nBLnE#k&3chCuQZ z68sl3-5%qlvW)jfm}i^WAyRo+VMU9%cJ7bl@*LtfnuHp;EApm0pUIm#vkZ_H4vSgI znY-%_ZQOo-NX7&-rq+?d_B-q;OTVx!t0L;tUcQr1@SJ7M*a#W>x2^leg07ySvCSgW zK6&&R)~KXwZ(-w)H%#l_+J&A^(NpDpf)?z}{i{09WiCtV2L7#e|E>>sfK!Zs5MZb8 zKN4Vqu&-c$M+7&T=mr>^zTHo|P7AfXW8sc|y$s!CN@Tt{W4V0j1*>Q1e>!n3xPgrm zP3%TyeF=_K^00D0TpJK0!6KC1JA3u^brMxVZr5EF*vSUjFRf~GQ4RO@id7C{>(eGp zC!RMk&i^RK@bB9-Z5Haa15TW)wS_~dP%4$dn~XNCg%D75(Il=gy33Lgjv<8})eWl0csYj%5ZpW}QH1%-1Y{U4v1kEp46sV> z;t?&fK)O;l^g~gz=l|C2>R%Chzd*zYQOh&w2UiU_9O|q~$4=VV=uhF}kBg3&+8m9- zTY0SoCwM-cy}LV@LAOf+%0r9+PWrJBTQWB%*4ccF*IsJw$$^j>UOw8h?rs(;q) z%I~KtZD)NuPuJeFiFO*J(mfobd;eLt$0?Q#8?!J>e)7}zSvW4JJ$hpnUWo5jxR_aV znuXB*`-%#epMK!z>g!U;ja2)@OJCSwWJl@pq+JSiV%^j^3`1FQjY5hBj_jpWnZAWP?%`v%Czu&I(~ZqP6(bH(T3KSP+! zNAPw;j73q@lM!li7zY@&E`%%pA*;#EfF^;2=g;ujF@7KFty6Xe?5#aUmPRPX8$REA zJbRUWqPC`>M5(&`NMk^1WxPhfsb?VbUDxw7qM!Cmlo2{s3rx=6KlY+o?70i( zTwkA4c80l1h+@mQg};i)@PIGoyrrDjt9I0mYme}~F5NHj*8{G->V!nQzB;#1kp8;+ z+5L-~I-Z=3Q0=@oaQaQ+J4wrP9sHiI=Umza?=1D9GHYI6ddZgYhN(PFJh4p+`Fo)IYXeoX5?=z&g;Xnvm?9IB_sW$A8B zvW+5|THcld-NWzkbQP>drL3uh?MQq@**l|6-g&8VTMovCwdthu%<27uc8Le+i^32v-BPi~7*FK(SB z5Rzs0%i~i0{YluRUBAytUDx5@smZ+o<#CY1YF|${eZjR8@G3T{SDfG} zG=le&bmG>1LepAy17#N=NfvI#QcH9sQTPTbh(6D)32DviI*}T67gqT=2r7$ zb6xR5nF?oXXe?&%iCq?NpuweyByJyNve<{6i9#H-0`Wx#g_#8(QBvcDPD5qVnJMY) z3>2TV6t;aCAtwhxAHWR^`3a55i%Ron(i703SIs-EF?o{aLxNU>TESr&JC)XtB#~}L z-w(6n8N7$M{bXH>bR1F=<7A9!C2rRht}HIpmZ^>&F~kS<$Hkf_5uFn z+@f24id|{U$7PHcW-_a+XzMm+xhfqh;KV=>XWln9m8F^#EW?z9D^WD-0ba6tn)TMO zNKR?nS9sgR`{f}#o1%?H8N`(1kAtXtLg%IPlmN^A!|#Bv1Wa7gkAF3oP|D*uzi4ypaMx^KfWL@tjxB@ZxKCSX2#GUSD8paIrh*! zML~9=w#-g&)4~tSFO#I&(GW)|nik3lwoT%fmJN)U^?jh3CO=GPvn#R}Em=*Nk$8mE zXo%zgW>I+Sh@9UpLjOKr8dQDwERjvcY;mk+?C8y8?{a|!8+9vdro&jhK~714$dg+b23ox51&9;@$DmHLMAqATUJ$=y9CivbprEP^X&e0OE}hRPbj zK9~C(=d)8>2@PmLHiB%jrBd~4{NPE)?MEKT-v1!$_3Y?lHjanah|((b z8lU4^*D?>l_hZ@bNvQ5?lRC8P7%$|gi%!+iH(_>bqNF1^fK7vGs!3projhuqYvVnI zm8*)`X{vL}L`P}j=r=_ZA5#;4MNI~Qt}(t{Yn-jBn*M56Oejfb@L-&>lbnclh`1-l z%s6_#@m8TJ&7pdmO+^Vs5IPo;pjxF+EF0PFoAA0mfr1jzFWPEgtHl|Wz#WxHb&^u` zj}(I>)G8dda*Ed$PI7Y+HlM~?J0-enC)3|1WmPBHm?Z}YAF)q$QNkoEbR>rkO9eHk z7z?L_6{UoDChto~?z${Us!Y)xPEm%WxcYB)l1|-Jlo+=Xe`MW1=0H(unwg4V2bQl* z)&a$rT$CIzk(#TmlHY)plmVL5UCFHi(;DW5+fa?eX=kU?npe_Vh11)#)6X|-?PYXIPVZYuX9{NwXlD#LWn78M7%s{f?Z_CL&bYCXF)n=k(zKQyRHM=#D;bJ1WXM@h z9)GxUd~W)98)ct$mAqya+&cfn^NtfQr%$|IIk7C9`A$3YgHz_GsLYk3%+-#}wdu@n zE15tf3#yX^e|AEJ2=lFq?Ihv2q|L7)k8ZZLyZ-yJ&=u4NS;Mm_Sfx;%xK__SlPP#% z%k3uFVMW=B>S$V$A7#^G4?`xa8^-!+%dU399XYQ^R*DSmUSEr4w zdd``P{ErIwdgYYHfajlMYtzJw{LyaMO>@AbjIRIL5YCSuoNG&VMH6x2WGu z6=6x$4C~6fJ{QW(+X^t%e^&y*Q~-iOK|(RlTgW44C^r?{94RwF0|*h4Cjy;%DqO6| zIIvV2dkjl@M1(L;GWyGB_H2R!NZPF^OpD*rsr_4^`Q%#7)7fiFq-#Gb;ziV9@Nq~by_B+mKK_hoD1eor zvF_rbw9%r0bq)1BGzJR{jinaLfQCej#;9ygXrr;ej`H2R7!9a5d@d-mE8&|GHj@a2 z5ugQgx^Kcz-vn777Af^S6-tM&t-`d%i|p!+_i)vRpqd0AJTGl3J3^kWsAOmC%on%YS0ek~4R^to@(&m51d zH&{W*5`YTzEH(})La%5I&=Frn*O-Hlwpu=%I;SmU`I+gci~sC>!E%=*;spq7oeuLD zE#-%x6bPkATm>BM-rK1i-V9OMcNR;E=A;2vf+2r;;v5H7xVteMH0ORmd}%~OaJmJn z@y}gAbyj&qfO^;fXgg&k+l3FYJ{0D0U+1(E_Lt4yF7^*|Shj@u`;DnO}FPZ#hyp;!w55hl5PPe;6G3noOt5C?EH zcGW748U-M;TqfJn6R&t0M)2TNXS;C>q!6K_qUYg*hUV)u0MA00m9{}?5K&GJ^dYQ> zE&SkVze*Nba0Ig7`=H<;i$M<@aJrkLHiYvF91i`PdVGa1;4p@+okzImoAU2@^|)Z= z8ED*c4~z~tzF3_Xfn+iup|+;m$BSsxKIH`~C=tf9Cr2h5Bf>xnWML%d%5c<6?HXqv z9fRdAU<9bWdy@v>GeScT%F|mR^8(f!(y**9G%pwS&3lMv^l1)h2zMN8IU16=d=@MZ zTna^55)gQ5g{ca87o}k+I%#B_&v)7kBa>Rwz2?=BawBGN=|^lAwJpx z4Q74n%L9kUu$t_MeCHct^IF>pfMbqbjw|`bvmQc0*}+ZB#2gBB&{3S^ z;uCz2asY);(VM#1Qa-wslzO=%zC?Zu9pQZ3e~|n(8W?=c7OkA*K(p&Tn&joaH6eZL zQZa@X4WejIm?1;MV+EC(@ zFyqvSqM^sY?d-4U2vLN{#5ChrDU9iTayBM&eEOiz!Og07J1KWBDFL0Hlgeb+qx1?% zCOdB)K0O^G%ZYgyGrfFGGmoQkoKvXZ{vK{Z5jF==xu4~c45u*Iu1`h39YZ$tco*Uj zZ0qPcUltcq@eXbLtf*)Az2cZ;=!3x24uy#`a2))r1-n@AMOZNF&&=*4(<_1=<;0Yx z90%VxF85dfB>G`crFJF}IW~KH$C;Lg-Dq}A2%b)9_Tbc4bUL*@=`?yT6OyM?5%Fx;aT|k5xGLOsEpOO@`;5!mE;4oYS#eR!Sx(X!MQSP zacIe2f0<(B3>WrtG`nul+3ICj-_%yu@gnnaq;GWuToU9KGhxl3nu*NiBceUwm7I`m z9FWTaT8l$6QsXriF(}#QrJxWJ|ozPSUvgEFNb z$_lPjiDi{d>FvDZQj)u4nhOKIq?J}PAv+s2%*TrkFt%&MQE*j&Btm0xK; z+3W9ody#X8KW~D|O4f6FKIW*rCNUwS%^Yrg@S=U~$=ma?^32mPG^9P!bV@+O1%Oyd zYs4~;X$GL#&ne7`!vC)o*qpvYB9{g=0+*!I^+zUu$RlT`VA)rmIbco z-C271TEhp%2SMd;^J5}drD#-ype{9d1j~Npc;|rP8B7Yjmt(u|r6bzX;}a3=9F_Nx zu}}@G!4C0TGIq=7ccV=a^tqQRVDUy#kIN^61sMPRF=1j?mJaOEVTd5E(BNT$Kns8| z*vtzsd#HuHbGrL7j_N^SL);zWxq9-(05{HNLWOA)ckUWS2QZo*i2yI4wTg6?ncFVt z4GGq%R@MJF``OL$;Kw7`AGshXNB3eD|6(Lp;ep(z!Z{WfSO2bB&Gj+hfP9?i{Ch%) z8NK9W)vS6&>CkmG5Oiujzq=bXa)j$Gioy*|UWY|eo6y_f9bD2CC)|qJQ~_MDp{RZe z+C0YDfA&2Gkl(J(hO2m32G|em(O~=XiW^-8=aF+7pCj2q`PF=;$LGmJaX8$Jz<}c| zM7H?#OufyaXG+0Uuvt%;bSY_;kC*&(+=y7Mf&v8kleo=Lioq%h%e=`EC3phMoCA)h$$LKTeRH&U%Yi2|_ulUruQbV2aKHcI z*#ye*oSIV!76#aLSq=*Sh4m}fa0Y>>+k5zVU=TPXUp-*TG9|{06~-$b?}Z8$#Pog` zW&=qQY#79c93rdfIim7Bfn{-@;zWj{sjxgMlTSI#WyK9dP*c$VWDxKD&Ku@()`xXJ6(jJFOB_Kp#bJ8f#; z-oCR#jE*WDT7G-=MCyGnP6*Fuyc%cg(qwP)JF2%f@qui=4TK?Vl8Ou*UmuOiks))6HFM&4VqyCU~9wd0SC|7mXqJiI&$OOg>-_3ts+MZHaDX zPkfEyo8#vCU~TmviD!P$@a4-*UfGuZv>gDO8V?1i)_{-RSw@0~d~#~zKQ1OFYwY(e za8+=mWBoU6LhYA4V#)cr&Q-G_rAEl z4plEt=CrKO7sCoE7l`OqL!nN%y|9|*QW}4gW^}>X`e<@fCUjE+tqu)0gWdGty_H%A z>YL!V;(41E>Z{>r%P|@a^2@^>)k*iRT_hQ(%kx*>-q~*4+;Zydz zVk7Rj9{d_HJxCGob#fof0Z8Ty!%s?N%0_XJ1&Lv*OM0aCn^r}YZRNPJ(r`{kEA=#p zDO8Re8|W@T@b5n%c@u0y(qNZ*&FYrC&1f@6i@K(ud>Wc`fDn*jO9Digk!;#!wq}Sv z@G{pFH|F7=R-yR)*=a=uE|pR3g4Eh(~P6Xa35N(pEc@A;Q7sc^id%MC1gFM-TJ zG1#1+kctM{tIU|Z(S7wOK#-LAq(gu&w-vjSTlYq16svRU2;@A?qX?(vM;gp4X`g?b!ebCHrm$)IG%}i zZ1QtF?fN)iS8w!fec|)u7!luer+cGGV{cEI`o0hkcNu>}_0*+&RWu4c#D>Mo#Tf+< z-J6X7ZwG`I$aC2xIhRUkzD)E>~OS7sfGzMdi<=?ZY98*K>b(i+cVa|s0v=PZDn^nqDMB~Xisk=w?k zIiV|Lsdvk%o9+)Oc#e$V)zq)DF!hMts34U}hVbjiT|Eo(2M%37?D3&)SMLko1BYk7 zc&tn=@8KNHcfQ#riVNk;`+`{Xe22bthHlQuqC1ysf9^)C8LOqKmjJ)1!ZZ@{_Bn1!vk?l#9mU=Rle%)CJa{S3~ryYuN#=I}Mh73OY2 ziu0JaLRj(j7(cCg=j;3Y!b)e?{Irodee?n#5~Vucm$OE_ojCNo{}5!12UY>}-N zH=6`mkyQhGc6qx#c!|D&u8YM&|&8p0n@E zN0+M2pqYNlgeHXE$L^=GZ(`SfE56NJ^RfC(*N~0x$hX*U2Qh5yZ;!6WESdiHx?d<& z$vab-E0CLivA_Ct?RxBT%F*XjHpMHwSKLH}J4|c09sM%9{w>m8>f6rN=HIQh99?_5 zd;K(*;kOsaOCgk$l4mNRr3T6 z5_#8%?{5*;7Kny05}$tmZ+!iqW&1gdNkTFGUG^m5GLmRhKTi%xY>Xr^LlW*MNv^Th ze`HL~c4-x|tUh@}mMrH+R^TE_1(NX@1AH-Lr6%&GK%#OFS#@TB%Ym%6Mka(`QsFYv zP%)YkGt#s&+ESyZ(P){IEvLqhXL zWPM}fMJ^*NV@lvqvXilC#*lHMv3Zj*sm9oHY>36=v3_Z+y=ZL1byyVp!;Tog}nikAw-Tc6@%Me%jJ zLTeI9yrnNV!DQbjEY?Wb*Fy;$qXf-R_P?YYSfd1UnTCj)hN_r`>6?aInMSyoMh2Q5 zjJX;v$9^K%;G1hNwzyJ%NkuyfcI2h$(KS;#msy;+S-gr_g1%Xzm06OTS#qEmtGP?f zFgsRemeypJ-eb0&F=m#Mn4rUe?N{ct&$vPyD|rC4ZS~F3J$=z-`o%`(g)v6d81v%1 zfub_=Qn!JU9`kbkfwCF%lQaDlYvz?T{S0x7YUBPYeT&);%o;a~`fz4ljKwK&W<#09 z=|pCBkHwkr{>B-Lb8CHP*DPAB`kTZp&ucN8^(`-C^t8EIUM%Ztjj`hCDC?9S_J z@3HLF>g<`Zyu?-6w`SSD$Y6?F4RRF^=v!TO%O7&Hx|)%FCB|xmf8<-K)wQ;+;U25& za>vJJtZuGl+*q@kn93Lzx4xB_HmPrY+bwm<&H8qr^<6FN=?v?MGVA*vtRD1OUmvrc zZL@m#(t0HC%6b<3#?2<}rAdNd7ReYaml6-c<6Ht<+ar9Jigcgq@74 zovguRNZ$EEg8tHw?vt2F{JE>^Ak9kfFIaAiweQTZ*NL#yJ!5~N$6kMnrNOLy%S-$1A1#R74rjz2$QLY( z3>;2bIhaIPP=Xw4V;s!3SeTbPR5m$Sel)kb?odACu;YTc%~ywFE=Su4b34`Bx%!R{ z+$N6hw|4|O?z(R5bo{nOnWM{bW7po>lrcy5@}aJmw{I>w(&UXjCGJ?RIePbwd0F2v zbld4SYwQzy=c?T0iR?RrZbNFD}|P6-B1iPla@?oP=;PARcY zsmGm;l{=-KaavFBb!xv~**03uv?mExI z#_6uxO3pZ!_BxkccP^iGu6X5q@~bn0+okdq@k+*>LtCu&7`SY+a;bGRsta<_jB#m@ zH#$}BLTGY1{g~Wz-9>fAr1D)E+qd!xAf?bwm2pxL#cX55AM4^2JQY7yZiU!yI0D0e?GH&wRiWI>$}%x zcYl4g``g#u>)bRTNrR}-poTQq4jSBphS*PIJ3>RAprI;gzX##<{e`mi+HO%v&9G|3 zR~nkf6C>$~RrBOC^yJ^+DewtHtlB(=-aR?v{_xBI=$W`*KCjDVpV{jvUSTA$gZJL6 zdEV7|WWJ|#{Q?;qCm#)*Z-Qg2|{wb#83B3%q$FEo7hCf2!- zBo|M!lB({w81Gm->+VBgb2UA(*b?Mz&bDB7cCoG3$I8#u;-QcKD<7M)MtVGtbFxXr z@{fh|AItQ4I#PW3Vs;RHe0Q~zgcVrEyuT#9tZRgyagl%0)_)aZaeWtJRsJVJtZgH| zAiwONT&?)G$gioBJJ0_j#B$}Uy!S7KSS3F&7k>z`9uDs1{E7TZF}6CCxAu*={sUSB-q_$<-1ryEM~%sC&zbwrRWak6eZ5~MpYvThX>-YNVTJwGi{EZu zQu`M76@j0ltA15P$DtG&Xr^o~?Q;oewP{)+|IX>(5(WJlJP!-+Uz$(3AAx$5DyOVi z1$YV?9;LM(!;dJW1rCh3mIqIoD?&Zv+0*qut>mO1v#LTVmeD@gnUtflCQcZ#XzS)O z`&qPgg$>%elOIch?dHV}<5F##+u*K4Msxk^MzYg$Pz*EK;6D;f>&ue(y;7y)QK5;& z0c^^6Bio8jbA>-8y$w}@&pO~~fG6Nou5J6FrRuWCRsWhIl@{Y8g$1Ktbq}eHy{_xZrKDZ@Y#>fjRy$7Z0-?F zf9X1!96BO@)KKizMa&M%rVAr>-9Z=U>cq~*-4i?<*vVghIPv21JDV6CxBJpnFI=wL z_vX^?t=BepemU`CGZXb9(2cMmk zr*O_vC#$tpHAbDb)x5hRPWu1KyRWb&`gUF5GbxaSHlaunF!UlNH0hWSdeH!(gVK~D zND&p45+FcmN|PofK&XNuh*A|01O$~PqM*`LKu~P2peQSTYwi85y{~n!&-eM9&0N>a z^Pk^y-;%v@dj8UcF?FI(D^ce|qx4hr?e58OjH_7Wc_`%9H!~;qJCQT4p?k0J=7m(r z?Xg_`Bkeh;>Yg)C4=;budL?gmV|+r^9C6pmOltGnin&~m?i&VQarnJB_`Sbz@DPbh zZ5$#Al$LmAEuGRZdO^zLEY%grc8F)6E;>3!p1cx$c~U-x?5#yQI^~w6(`ZI;{-LO+$(Nb&Pa5oqqmfUP)1zpJ@u3dLi1K>3{gs~~2h^Tb(lH@-r?0z+$ zI8-CYC1-wE-b?zT5f}wxy6a#9@)DTFZkjwpaL-7+a{QdbsW-+#7UNnN+a@NQC~8@A!>vanTnbi$Dt0l8NkF%# z<0?ge-YuWOi20Rw$JHm!W@i*?FEum1Dt}!zisY5^rA6|n;n7F zU>UJIOQS|d2}+hRk6@)M`{j6+x#|}@rq3SaR?}(LHNYpJe&pO`=fl_Phz{Z7skXR^ zGWD=Tb6*Bbn4frWYG>n-kRLkW3jt7AP(4_S$+j@*FK^03$uOa$h8t>u{EY`z&J~*F z-@sNCWPRNK?VLxlN6ua+_s;;Y3rHU;&!xWjruuR2F1lTGMJIdC$y;U<$*ZqsjdI$F zoX2|M7QsH~>b!X54#5vpB4X2K_uH(xtH)f1VY9Z3F}*HGa@}SG=9YRsJ115F%EqY} ztV&F3-!*%r8lWvY*f@lTl!YYDQ|UJ<k#Wa_!KQ+AEMA3eUOFa~Vjpr7GLlcVoq zLsy5w04j1iY~=Q#-C@VHDce|$vGGvg=HB9Oi`=ugs zTt4|y*R4xWVY(&oa|blymaoQDNwYAuVSy zQPlxEC&|Yez;%7&IKYIfR})uiX>RR8Hg(bjc_2X}$!9g%F)C4lPIE6z=CATo+2(bU zkJW46XIzmSS?Bgy;%qgXFO;5iS}o;lVX~(S?-2yZv8?)!vf6KAAq`i{qAnS2fE`>SRv4WX?oo zPV30UMj#S!nK5577lbY^>0Dl!&76(8yju8gi1pm%@-piGhFH&6aeWUmq{Af(aB%en z7^)}>(~-r=DqP#iV*QJ<0Q)3q9y>s=X@Hv0`{F4_@_5t~) zck;u83nFw2B3%p4T_}huD!ABD5dESccBg9Yw5*VDB`A|2I~doLERV}LW^M0rVfWSgGGK4Az`d5Su+62ajyd>k&-aHCM=i3`|bslM+O00>69?9B?;c|TD~C@l}?6z7Y3po zLwY01YO>3|j2ML{YIk%1`mQD7i)FjQfAy5VPxR~vbQtn&j;atUt`O<05Pex8{<8un zQaRKC74UY6|K{(2>DOmYjD z#{>aHubrHp2uzW;SPOj6#-iH*>p$@kUtb9c*sdjv2hYq|c3;p1F<3wxs>qJNssd_n ztWax(tNS~c%n4@s#6h4Juxr5T;#f%#K!_%9RWHD;$A$#Tv;a)oKOk!pOezb!v{wx7 zQ>@Gqsh84&axm%nQrN3O_17Mh`@m~UC2H?FE9d|KAK6J{5u6nU5GK6F5U^{>{zd^o zNtEmm2F%Fd`}aZt7q!3K4J^PPdA?R(2{ycCcllNX>ey>@OO%9~Rqe;ZdURp-xDt?o z?34n0n`_ze7ziknz?V@$^*wmW;T*I5T5Jn1T|N%s)FT0P>BeisMox7Y0Km#tATwXh zrMB8D1?R=RwME9S>EIi7FQBgL!TVFee6UOjS2Z$Hb4C%6gc?=VPQsc|xG;bP2G-!k zaefJF4USS!qXfszAK8_;SXk@(n;S)%Yw$7k|uF8>I_;E0LJBS|6)CS#dYQyypya- zNa+$RkjD>{_VPEbAp{?F$b#44Cm-=5^7NH}GPW?5lJne134%?45L8ZaR$>W21+6xU zwUE;$~AfM)TVZ=`9Kxm~UtpwffS2pp5#c99~}w13;^^?&&jC z@GX?lLIeNkzE6t4QmPuL5BIp<2_u8rdwO6Vz6Hnv^E4nk2Y8`=qPX4PdRoo9*SqzF z(%oaNrD3nz%AniOPqfTaNkl3JNT`M;nYXL(Et<&`E@avA&#s#N&Y@C(#a2xfFHE}= z^ht~WeEJrIk%KK|8@iafM=*_`*srIA?s4$0Re^RLisD&yPaS)th%n4&@LL*F>F1>d zG{|a0N4FsrWHqu#g z8-m|Y=}OB0BGhVGdEnbx1IOo9D%Utl{9;Pe9S%Gw>6u#Adeg%sp8*oeCKfWvIt%MDN8Xw$&@~8;k1~8vk zEwyNr7CgYofJCVY{Uc}uP^L3p&ooE$ySkWlDhhIx!Ka607vX#p(0uwR)fDZT-kl|r z6_yAHW3!g>N4!e<75J)NOF~{*fOdmr)m9kU_%>|3{RReJ)(h3>0y6j}iXyTwx|qy2 z0N{tqC4g=|Ac`<7r3S;WY-uFxae#+cYvQ(AM?_mbr%UbyKOI+6o7}+Wkpa$y+tX9* zJk7OzCxn3v27IKBW0657jK0x@Yc|&+dMi6TaAYYY#ZC8tcF&yEjY$29{;r2?&EAMT ztk#YChoxVIQN2Kc{En?6!$z$KG>SX9KLe@7@M}_SD~q_$AfWq)Fgx{G;_let5W#D^ zI;5$l80shts2jJ0?>mIiz&%iCRR%X3DC>1~X17`0!dwi9X~PIo^KjoPa|;m`0|3GC z+G!2lYjEei&RURQGTJ3u_s$~w zDf=jPMPhEkW==X>7ubS7d&mx^m$DWPZQ-Q6%?Vt5^NsaqDxFZ^sa9~o1H(x?_Opw% z0V_j|CX>P47uWa~?7B7f zXL93^&&+Do426lg2>ij4QYdDj2$)TMcAA55QDi=EVdQf?+y1T6iw6M%@kmjSSwKb% z>yH+!D<94>3muJpb4fRnv~>Q~bDvF|`7z*4YLBslf+h}lvz}&_%NC${{;Y;36%W*u z!k2e-+eLa|TcG;OOCkI-QWGbu#;?gop=H^zc{sNIJxe6jQ7HviqrG0Lm|kj~uE~bL zni6hdv+8)aoTtqRF8VcAoET|n$m2

_W!!J}f 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

_`G2+0#vPjt4gV;n%s diff --git a/src/@types/Behaviors.d.ts b/src/@types/Behaviors.d.ts deleted file mode 100644 index 03e3ce62..00000000 --- a/src/@types/Behaviors.d.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { IGrabber } from "./grabber/Grabber" -import { IModel } from "./model/Model" -import { IRecognizer } from "./recognizer/Recognizer" -import { TTheme } from "./style/Theme" -import { TConverstionState } from "./configuration/RecognitionConfiguration" -import { TPenStyle } from "./style/PenStyle" -import { TStroke } from "./model/Stroke" -import { TUndoRedoContext } from "./undo-redo/UndoRedoContext" -import { TConfiguration } from "./Configuration" -import { StyleManager } from "../style/StyleManager" - -export type TBehaviorOptions = { - configuration: TConfiguration - behaviors?: { - grabber?: IGrabber - recognizer?: IRecognizer - } - penStyle?: TPenStyle - theme?: TTheme -} - -export interface IBehaviors -{ - name: string - grabber: IGrabber - recognizer: IRecognizer - context: TUndoRedoContext - options: TBehaviorOptions - styleManager: StyleManager - mode: ModeInteraction - #configuration: TConfiguration - - get currentPenStyle(): TPenStyle - - get model(): IModel - - get penStyle(): TPenStyle - setPenStyle(penStyle?: TPenStyle) - - get penStyleClasses(): string - setPenStyleClasses(penStyleClasses?: string) - - get theme(): TTheme - setTheme(theme?: TTheme) - - get configuration(): TConfiguration - set configuration(conf: TConfiguration) - - async init: (element: HTMLElement) => Promise - async export(mimeTypes?: string[]): Promise - async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - async resize(height: number, width: number): Promise - async undo(): Promise - async redo(): Promise - - async waitForIdle?(): Promise - async importPointEvents?(strokes: TStroke[]): Promise - async import?(data: Blob, mimeType?: string): Promise - - async clear(): Promise - - async destroy(): Promise -} diff --git a/src/@types/Configuration.d.ts b/src/@types/Configuration.d.ts deleted file mode 100644 index 0e2cad3b..00000000 --- a/src/@types/Configuration.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { TEventConfiguration } from "./configuration/EventConfiguration" -import { TGrabberConfiguration } from "./configuration/GrabberConfiguration" -import { TRecognitionConfiguration, TRecognitionConfigurationClient } from "./configuration/RecognitionConfiguration" -import { TRenderingConfiguration } from "./configuration/RenderingConfiguration" -import { TServerConfiguration, TServerConfigurationClient } from "./configuration/ServerConfiguration" -import { TTriggerConfiguration } from "./configuration/TriggerConfiguration" -import { TUndoRedoConfiguration } from "./configuration/UndoRedoConfiguration" - -export type TConfiguration = { - server: TServerConfiguration - recognition: TRecognitionConfiguration - grabber: TGrabberConfiguration - rendering: TRenderingConfiguration - triggers: TTriggerConfiguration - events: TEventConfiguration - "undo-redo": TUndoRedoConfiguration -} - -export type TConfigurationClient = { - server?: TServerConfigurationClient - recognition?: TRecognitionConfigurationClient - grabber?: TGrabberConfiguration - rendering?: TRenderingConfiguration - triggers?: TTriggerConfiguration - events?: TEventConfiguration - "undo-redo"?: TUndoRedoConfiguration -} diff --git a/src/@types/configuration/EventConfiguration.d.ts b/src/@types/configuration/EventConfiguration.d.ts deleted file mode 100644 index 973f5500..00000000 --- a/src/@types/configuration/EventConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TEventConfiguration = { - processDelay: number -} \ No newline at end of file diff --git a/src/@types/configuration/GrabberConfiguration.d.ts b/src/@types/configuration/GrabberConfiguration.d.ts deleted file mode 100644 index 9e23dace..00000000 --- a/src/@types/configuration/GrabberConfiguration.d.ts +++ /dev/null @@ -1,11 +0,0 @@ - -export type TListenerConfiguration = { - capture: boolean - passive: boolean -} - -export type TGrabberConfiguration = { - listenerOptions: TListenerConfiguration - xyFloatPrecision: number - timestampFloatPrecision: number -} \ No newline at end of file diff --git a/src/@types/configuration/RecognitionConfiguration.d.ts b/src/@types/configuration/RecognitionConfiguration.d.ts deleted file mode 100644 index e05bc0a4..00000000 --- a/src/@types/configuration/RecognitionConfiguration.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { TConvertConfiguration } from "./recognition/ConvertConfiguration" -import { TDiagramConfiguration } from "./recognition/DiagramConfiguration" -import { TExportConfiguration } from "./recognition/ExportConfiguration" -import { TMathConfiguration } from "./recognition/MathConfiguration" -import { TRawContentConfiguration } from "./recognition/RawContentConfiguration" -import { TTextConfiguration } from "./recognition/TextConfiguration" - -export type TDebugConfiguration = { - "draw-text-boxes": boolean - "draw-image-boxes": boolean -} - -export type TRecognitionRendererConfiguration = { - debug: TDebugConfiguration -} - -export type TRecognitionType = "TEXT" | "MATH" | "DIAGRAM" | "Raw Content" - -export type TConverstionState = "DIGITAL_EDIT" | "HANDWRITING" - -export type TRecognitionConfiguration = { - convert?: TConvertConfiguration - type: TRecognitionType - alwaysConnected: boolean - lang: string - math: TMathConfiguration - text: TTextConfiguration - diagram: TDiagramConfiguration - renderer: TRecognitionRendererConfiguration - export: TExportConfiguration - "raw-content": TRawContentConfiguration - gesture: TGesture -} - -export type TRecognitionConfigurationClient = { - convert?: TConvertConfiguration - type?: TRecognitionType - alwaysConnected?: boolean - lang?: string - math?: TMathConfiguration - text?: TTextConfiguration - diagram?: TDiagramConfiguration - renderer?: TRecognitionRendererConfiguration - export?: TExportConfiguration - "raw-content"?: TRawContentConfiguration - gesture?: { enable: boolean } -} diff --git a/src/@types/configuration/RenderingConfiguration.d.ts b/src/@types/configuration/RenderingConfiguration.d.ts deleted file mode 100644 index e59c85bd..00000000 --- a/src/@types/configuration/RenderingConfiguration.d.ts +++ /dev/null @@ -1,20 +0,0 @@ - -export type TGuidesConfiguration = { - enable: boolean - gap: numnber -} - -export type TSmartGuidesConfiguration = { - enable: boolean - fadeOut: { - enable: boolean - duration: number - } -} - -export type TRenderingConfiguration = { - minHeight: number - minWidth: number - smartGuide: TSmartGuidesConfiguration - guides: TGuidesConfiguration -} diff --git a/src/@types/configuration/ServerConfiguration.d.ts b/src/@types/configuration/ServerConfiguration.d.ts deleted file mode 100644 index 2068a9aa..00000000 --- a/src/@types/configuration/ServerConfiguration.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -export type TProtocol = "WEBSOCKET" | "REST" - -export type TSchene = "https" | "http" - -export type TServerConfiguration = { - protocol: TProtocol, - scheme: TSchene, - host: string - applicationKey: string - hmacKey: string - version: string - useWindowLocation?: boolean - websocket: { - pingEnabled: boolean - pingDelay: number - maxPingLostCount: number - autoReconnect: boolean - maxRetryCount: number - fileChunkSize: number - } -} - -export type TServerConfigurationClient = { - protocol?: TProtocol, - scheme?: TSchene, - host?: string - applicationKey?: string - hmacKey?: string - version?: string - useWindowLocation?: boolean - websocket?: { - pingEnabled?: boolean - pingDelay?: number - maxPingLostCount?: number - autoReconnect?: boolean - maxRetryCount?: number - fileChunkSize?: number - } -} diff --git a/src/@types/configuration/TriggerConfiguration.d.ts b/src/@types/configuration/TriggerConfiguration.d.ts deleted file mode 100644 index 0dd95743..00000000 --- a/src/@types/configuration/TriggerConfiguration.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Configure when the action is triggered. - * POINTER_UP : Action is triggered on every PenUP. - * This is the recommended mode for CDK V3 WebSocket recognitions. - * QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. - * The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. - * This is the recommended mode for all REST discoveries. - * DEMAND : Action is triggered on external demande - */ - export type TTriggerConfiguration = { - exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND" - exportContentDelay: number - resizeTriggerDelay: number -} \ No newline at end of file diff --git a/src/@types/configuration/UndoRedoConfiguration.d.ts b/src/@types/configuration/UndoRedoConfiguration.d.ts deleted file mode 100644 index 756eaad8..00000000 --- a/src/@types/configuration/UndoRedoConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TUndoRedoConfiguration = { - maxStackSize: number -} \ No newline at end of file diff --git a/src/@types/configuration/index.ts b/src/@types/configuration/index.ts deleted file mode 100644 index 1987dfb6..00000000 --- a/src/@types/configuration/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./recognition" -export * from "./EventConfiguration" -export * from "./GrabberConfiguration" -export * from "./RecognitionConfiguration" -export * from "./RenderingConfiguration" -export * from "./ServerConfiguration" -export * from "./TriggerConfiguration" -export * from "./UndoRedoConfiguration" diff --git a/src/@types/configuration/recognition/ConvertConfiguration.d.ts b/src/@types/configuration/recognition/ConvertConfiguration.d.ts deleted file mode 100644 index c86a4fc7..00000000 --- a/src/@types/configuration/recognition/ConvertConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TConvertConfiguration = { - convertOnDoubleTap: boolean -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/DiagramConfiguration.d.ts b/src/@types/configuration/recognition/DiagramConfiguration.d.ts deleted file mode 100644 index 0a15e259..00000000 --- a/src/@types/configuration/recognition/DiagramConfiguration.d.ts +++ /dev/null @@ -1,19 +0,0 @@ - -import { TEraserConfiguration } from "./EraserConfiguration" -import { TTextConfConfiguration } from "./TextConfiguration" - -export type TDiagramConvertConfiguration = { - edge?: boolean - node?: boolean - text?: boolean - "match-text-size"?: boolean -} - -export type TDiagramConfiguration = { - mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[] - "enable-sub-blocks"?: boolean - text?: TTextConfConfiguration - convert?: TDiagramConvertConfiguration - "session-time"?: number - eraser?: TEraserConfiguration -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/EraserConfiguration.d.ts b/src/@types/configuration/recognition/EraserConfiguration.d.ts deleted file mode 100644 index 11a0e44e..00000000 --- a/src/@types/configuration/recognition/EraserConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TEraserConfiguration = { - "erase-precisely": boolean -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/ExportConfiguration.d.ts b/src/@types/configuration/recognition/ExportConfiguration.d.ts deleted file mode 100644 index 6df9ffd6..00000000 --- a/src/@types/configuration/recognition/ExportConfiguration.d.ts +++ /dev/null @@ -1,37 +0,0 @@ - -export type TImageViewportConfiguration = { - x: number - y: number - width: number - height: number -} - -export type TImageConfiguration = { - guides: boolean - viewport: TImageViewportConfiguration -} - -export type TJiixConfiguration = { - "bounding-box"?: boolean - strokes: boolean - text?: { - chars: boolean - words: boolean - } - style?: boolean -} - -export type TMathMLFlavor = { - name: string -} - -export type TMathMLExport = { - flavor: TMathMLFlavor -} - -export type TExportConfiguration = { - "image-resolution"?: number - image?: TImageConfiguration - jiix?: TJiixConfiguration - mathml?: TMathMLExport -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/MarginConfiguration.d.ts b/src/@types/configuration/recognition/MarginConfiguration.d.ts deleted file mode 100644 index 4a270d92..00000000 --- a/src/@types/configuration/recognition/MarginConfiguration.d.ts +++ /dev/null @@ -1,7 +0,0 @@ - -export type TMarginConfiguration = { - bottom: number - left: number - right: number - top: number -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/MathConfiguration.d.ts b/src/@types/configuration/recognition/MathConfiguration.d.ts deleted file mode 100644 index 4be7b77f..00000000 --- a/src/@types/configuration/recognition/MathConfiguration.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TMarginConfiguration } from "./MarginConfiguration" -import { TEraserConfiguration } from "./EraserConfiguration" - -export type TRoundingMode = "half up" | "truncate" - -export type TAngleUnit = "deg" | "rad" - -export type TSolverOptions = "algebraic" | "numeric" - -export type TSolverConfiguration = { - enable?: boolean - "fractional-part-digits"?: number - "decimal-separator"?: string - "rounding-mode"?: TRoundingMode - "angle-unit"?: TAngleUnit - options?: TSolverOptions -} - -export type TUndoRedoMode = "stroke" | "session" - -export type TMathUndoRedoConfiguration = { - mode: TUndoRedoMode -} - -export type TMathConfiguration = { - mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[] - solver?: TSolverConfiguration - margin: TMarginConfiguration - "undo-redo"?: TMathUndoRedoConfiguration - customGrammar?: string - customGrammarId?: string - customGrammarContent?: string - eraser?: TEraserConfiguration - "session-time"?: number - "recognition-timeout"?: number -} diff --git a/src/@types/configuration/recognition/RawContentConfiguration.d.ts b/src/@types/configuration/recognition/RawContentConfiguration.d.ts deleted file mode 100644 index c22766aa..00000000 --- a/src/@types/configuration/recognition/RawContentConfiguration.d.ts +++ /dev/null @@ -1,15 +0,0 @@ - -import { TEraserConfiguration } from "./EraserConfiguration" -import { TTextConfConfiguration } from "./TextConfiguration" - -export type TRawContentRecognitionConfiguration = { - text: boolean - shape: boolean -} - -export type TRawContentConfiguration = { - text?: TTextConfConfiguration - "session-time"?: number - recognition?: TRecognitionConfiguration - eraser?: TEraserConfiguration -} diff --git a/src/@types/configuration/recognition/TextConfiguration.d.ts b/src/@types/configuration/recognition/TextConfiguration.d.ts deleted file mode 100644 index 773ba48a..00000000 --- a/src/@types/configuration/recognition/TextConfiguration.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TMarginConfiguration } from "./MarginConfiguration" -import { TEraserConfiguration } from "./EraserConfiguration" - -export type TTextGuidesConfiguration = { - enable: boolean -} - -export type TTextConfConfiguration = { - customResources?: string[] - customLexicon?: string[] - addLKText?: boolean -} - -export type TTextConfiguration = { - text?: boolean - mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[] - margin: TMarginConfiguration - guides?: TTextGuidesConfiguration - configuration?: TTextConfConfiguration - eraser?: TEraserConfiguration -} diff --git a/src/@types/configuration/recognition/index.ts b/src/@types/configuration/recognition/index.ts deleted file mode 100644 index ce1200bf..00000000 --- a/src/@types/configuration/recognition/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./ConvertConfiguration" -export * from "./DiagramConfiguration" -export * from "./EraserConfiguration" -export * from "./ExportConfiguration" -export * from "./MarginConfiguration" -export * from "./MathConfiguration" -export * from "./RawContentConfiguration" -export * from "./TextConfiguration" diff --git a/src/@types/geometry.ts b/src/@types/geometry.ts deleted file mode 100644 index 8ff835df..00000000 --- a/src/@types/geometry.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export type TPoint = { - x: number - y: number -} - -export type TPointer = TPoint & { - t: number - p: number -} - -export type TSegment = { p1: TPoint, p2: TPoint } - -export type TLineEquation = { a: number, b: number} diff --git a/src/@types/grabber/Grabber.d.ts b/src/@types/grabber/Grabber.d.ts deleted file mode 100644 index 15ef4cd5..00000000 --- a/src/@types/grabber/Grabber.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TPointer } from "../geometry" - -export interface IGrabber { - attach(domElement?: HTMLElement): void - - detach(domElement?: HTMLElement): void - - onPointerDown(evt: PointerEvent, point: TPointer): void - - onPointerMove(evt: PointerEvent, point: TPointer): void - - onPointerUp(evt: PointerEvent, point: TPointer): void -} diff --git a/src/@types/index.ts b/src/@types/index.ts deleted file mode 100644 index 2b7dac29..00000000 --- a/src/@types/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./Behaviors" -export * from "./Configuration" -export * from "./geometry" -export * from "./configuration" -export * from "./grabber/Grabber" -export * from "./model" -export * from "./recognizer" -export * from "./renderer/Symbol" -export * from "./style" -export * from "./undo-redo/UndoRedoContext" diff --git a/src/@types/model/Model.d.ts b/src/@types/model/Model.d.ts deleted file mode 100644 index 269e4dbd..00000000 --- a/src/@types/model/Model.d.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { TPoint, TPointer } from "../geometry" -import { TStroke } from "./Stroke" -import { TPenStyle } from "../style/PenStyle" -import { TRecognitionPositions } from "./RecognitionPositions" - -export type TWordExport = { - id?: string - label: string, - candidates?: string[] -} - -export type TJIIXExport = { - type: string, - id: string, - label: string, - version: string, - words: TWordExport[] -} - -/** - * List all supported MIME types for export. - * Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} - */ -export type TExport = { - /** @hidden */ - [key: string]: TJIIXExport | string | Blob - /** - * vnd.myscript.jiix is used for text and raw-content exports - */ - "application/vnd.myscript.jiix"?: TJIIXExport - /** - * text/plain is only use for text export - */ - "text/plain"? : string - /** - * x-latex is only use for math export - * @see {@link https://katex.org/docs/browser.html | katex} to render - */ - "application/x-latex"?: string - /** - * mathml+xml is only use for math export - * @see {@link https://www.w3.org/Math/whatIsMathML.html | Mathematical Markup Language} - */ - "application/mathml+xml"?: string - /** - * svg+xml is only use for diagram export - */ - "image/svg+xml"?: string - /** - * vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob | Blob} - */ - "application/vnd.openxmlformats-officedocument.presentationml.presentation"?: Blob -} - -export interface IModel -{ - readonly creationTime: number - modificationDate: number - currentStroke?: TStroke - positions: TRecognitionPositions - rawStrokes: TStroke[] - selectedStrokes: TStroke[] - converts?: TExport - exports?: TExport - width: number - height: number - idle: boolean - - mergeExport(exports: TExport) - mergeConvert(converts: TExport) - - addPoint(stroke: TStroke, point: TPointer): void - addStroke(stroke: TStroke): void - extractUnsentStrokes(): TStroke[] - - initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi: number = 96): void - appendToCurrentStroke(point: TPointer): void - endCurrentStroke(point: TPointer): void - - resetSelectedStrokes(): void - appendSelectedStrokesFromPoint(point: TPoint): void - - removeStroke(id: string): void - updateStroke(updatedStroke: TStroke): void - removeStrokesFromPoint(point: TPoint): string[] - - updatePositionSent(position: number = this.model.rawStrokes.length - 1): void - updatePositionReceived(): void - - getClone(): IModel - - clear(): void -} diff --git a/src/@types/model/RecognitionPositions.d.ts b/src/@types/model/RecognitionPositions.d.ts deleted file mode 100644 index 04223845..00000000 --- a/src/@types/model/RecognitionPositions.d.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export type TRecognitionPositions = { - lastSentPosition: number - lastReceivedPosition: number -} diff --git a/src/@types/model/Stroke.d.ts b/src/@types/model/Stroke.d.ts deleted file mode 100644 index c509bea7..00000000 --- a/src/@types/model/Stroke.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TPointer } from "../geometry" -import { TSymbol } from "../renderer/Symbol" -import { TPenStyle } from "../style/PenStyle" - -export type TStrokeJSON = { - id: string - pointerType: string - x: number[] - y: number[] - t: number[] - p: number[] -} - -export type TStrokeGroupJSON = { - penStyle?: string - strokes: TStrokeJSON[] -} - -export type TStroke = TSymbol & { - id: string - pointerId: number - pointerType: string - pointers: TPointer[] - length: number -} - -export type TStrokeGroup = { - penStyle: TPenStyle - strokes: TStroke[] -} diff --git a/src/@types/model/index.ts b/src/@types/model/index.ts deleted file mode 100644 index e77dd1c6..00000000 --- a/src/@types/model/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Model" -export * from "./RecognitionPositions" -export * from "./Stroke" diff --git a/src/@types/modules.d.ts b/src/@types/modules.d.ts deleted file mode 100644 index 645fe33b..00000000 --- a/src/@types/modules.d.ts +++ /dev/null @@ -1,22 +0,0 @@ - -/** - * @hidden - */ -type JsonCSS = { - toCSS(json): string - toJSON(style): TTheme -} - -/** - * @hidden - */ -declare module "json-css" - -/** - * @hidden - */ -declare module "crypto-js/enc-hex" -/** - * @hidden - */ -declare module "crypto-js/hmac-sha512" diff --git a/src/@types/recognizer/Recognizer.d.ts b/src/@types/recognizer/Recognizer.d.ts deleted file mode 100644 index 45507ed4..00000000 --- a/src/@types/recognizer/Recognizer.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IModel } from "../model/Model" - -export interface IRecognizer { - export(model: IModel, mimeTypes?: string[]): Promise - resize(model: IModel): Promise - import?(model: IModel, data: Blob, mimeType?: string): Promise -} diff --git a/src/@types/recognizer/RestRecognizer.d.ts b/src/@types/recognizer/RestRecognizer.d.ts deleted file mode 100644 index 4b177d9d..00000000 --- a/src/@types/recognizer/RestRecognizer.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TDiagramConfiguration } from "../configuration/recognition/DiagramConfiguration" -import { TMathConfiguration } from "../configuration/recognition/MathConfiguration" -import { TRawContentConfiguration } from "../configuration/recognition/RawContentConfiguration" -import { TTextConfiguration } from "../configuration/recognition/TextConfiguration" -import { TConverstionState } from "../configuration/RecognitionConfiguration" -import { TStrokeGroupJSON } from "../model/Stroke" - -export type TRestPostConfiguration = { - lang: string, - diagram?: TDiagramConfiguration, - math?: TMathConfiguration, - "raw-content"?: TRawContentConfiguration, - text?: TTextConfiguration, - export: TExportConfiguration -} - -export type TRestPostData = { - configuration: TRestPostConfiguration, - xDPI: number, - yDPI: nmber, - contentType: string, - conversionState?: TConverstionState - height: number, - width: nmber, - strokeGroups: TStrokeGroupJSON[] -} \ No newline at end of file diff --git a/src/@types/recognizer/WSRecognizer.d.ts b/src/@types/recognizer/WSRecognizer.d.ts deleted file mode 100644 index 5b5ed24c..00000000 --- a/src/@types/recognizer/WSRecognizer.d.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { TExport } from "../model/Model" - - -export type TWebSocketEvent = { - type: string - [key: string]: unknown -} - -export type TWebSocketErrorEvent = { - type: string - code?: number | string - message?: string - data? : { - code: number | string - message: string - } -} - -export type TWebSocketHMACChallengeEvent = TWebSocketEvent & { - hmacChallenge: string - iinkSessionId: string -} - -export type TContentPackageDescriptionMessage = TWebSocketEvent & { - contentPartCount: number -} - -export type TWebSocketPartChangeEvent = TWebSocketEvent & { - partIdx: number - partId: string - partCount: number -} - -export type TWebSocketContentChangeEvent = TWebSocketEvent & { - partId: string - canUndo: boolean - canRedo: boolean - empty: boolean - undoStackIndex: number - possibleUndoCount: number -} - -export type TWebSocketExportEvent = TWebSocketEvent & { - partId: string - exports: TExport -} - -export type TUpdatePatchType = "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE" - -export type TUpdatePatch = { - type: TUpdatePatchType -} - -export type TUpdatePatchReplaceAll = TUpdatePatch & { - svg: string -} - -export type TUpdatePatchReplaceELement = TUpdatePatch & { - id: string - svg: string -} - -export type TUpdatePatchInsertBefore = TUpdatePatch & { - refId: string - svg: string -} - -export type TUpdatePatchRemoveElement = TUpdatePatch & { - id: string -} - -export type TUpdatePatchAppendChild = TUpdatePatch & { - parentId?: string - svg: string -} - -export type TUpdatePatchRemoveChild = TUpdatePatch & { - parentId: string - index: number -} - -export type TUpdatePatchRemoveAttribut = TUpdatePatch & { - id?: string - name: string -} - -export type TUpdatePatchSetAttribut = TUpdatePatch & { - id?: string - name: string - value: string -} - -export type TWebSocketSVGPatchEvent = TWebSocketEvent & { - updates: TUpdatePatch[] - layer: ("MODEL" | "CAPTURE") -} diff --git a/src/@types/recognizer/index.ts b/src/@types/recognizer/index.ts deleted file mode 100644 index adee9a25..00000000 --- a/src/@types/recognizer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Recognizer" -export * from "./RestRecognizer" -export * from "./WSRecognizer" diff --git a/src/@types/renderer/Symbol.d.ts b/src/@types/renderer/Symbol.d.ts deleted file mode 100644 index cb526eb8..00000000 --- a/src/@types/renderer/Symbol.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TPenStyle } from "../style/PenStyle" -import { TPoint, TPointer } from "../geometry" - -export type TSymbol = { - elementType?: string - type: string - style: TPenStyle -} - -export type TShapeSymbol = TSymbol & { - candidates: TSymbol[] - selectedCandidateIndex: number -} - -export type TShapeEllipseSymbol = TSymbol & { - centerPoint: TPoint - maxRadius: number - minRadius: number - orientation: number - startAngle: number - sweepAngle: number - beginDecoration?: string - endDecoration?: string - beginTangentAngle: number - endTangentAngle: number -} - -export type TShapeLineSymbol = TShapeEllipseSymbol & { - firstPoint: TPoint - lastPoint: TPoint -} - -export type TLineSymbol = TSymbol & { - data: { - p1: TPoint - p2: TPoint - } -} - -export type TShapeTableSymbol = TSymbol & { - lines: TShapeLineSymbol[] -} - -export type TShapeRecognizedSymbol = TSymbol & { - primitives: TSymbol[] -} - -export type TUnderLineSymbol = TSymbol & { - data: { - firstCharacter: number - lastCharacter: number - } -} - -export type TTextUnderlineDataSymbol = { - topLeftPoint: TPointer - height: number - width: number - textHeight: number - justificationType: string -} - -export type TTextUnderlineSymbol = TSymbol & { - label: string, - data: TTextUnderlineDataSymbol - underlineList: TUnderLineSymbol[] -} diff --git a/src/@types/style/PenStyle.d.ts b/src/@types/style/PenStyle.d.ts deleted file mode 100644 index 61a7f23f..00000000 --- a/src/@types/style/PenStyle.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @typedef {Object} PenStyle - * @property {String} color=#000000 Color (supported formats rgb() rgba() hsl() hsla() #rgb #rgba #rrggbb #rrggbbaa) - * @property {String} -myscript-pen-width=1 Width of strokes and primitives in mm (no other unit is supported yet) - * @property {String} -myscript-pen-fill-style=none - * @property {String} -myscript-pen-fill-color=#FFFFFF00 Color filled inside the area delimited by strokes and primitives - */ -export type TPenStyle = { - color?: string - width?: number - "-myscript-pen-width"?: number - "-myscript-pen-fill-style"?: string - "-myscript-pen-fill-color"?: string -} \ No newline at end of file diff --git a/src/@types/style/Theme.d.ts b/src/@types/style/Theme.d.ts deleted file mode 100644 index ea0eee1d..00000000 --- a/src/@types/style/Theme.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TPenStyle } from "./PenStyle" - -export type TMathTheme = { - "font-family": string -} - -export type TMathSolvedTheme = { - "font-family": string - color: string -} - -export type TTextTheme = { - "font-family": string, - "font-size": number -} - -export type TTheme = { - ink: TPenStyle - ".math": TMathTheme - ".math-solved": TMathSolvedTheme - ".text": TTextTheme - [key: string]: unknown -} \ No newline at end of file diff --git a/src/@types/style/index.ts b/src/@types/style/index.ts deleted file mode 100644 index c2ef1678..00000000 --- a/src/@types/style/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./PenStyle" -export * from "./Theme" diff --git a/src/@types/undo-redo/UndoRedoContext.d.ts b/src/@types/undo-redo/UndoRedoContext.d.ts deleted file mode 100644 index 72cc625a..00000000 --- a/src/@types/undo-redo/UndoRedoContext.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IModel } from "../model/Model" - -export type TUndoRedoContext = { - canUndo: boolean - canRedo: boolean - empty: boolean - stackIndex: number - possibleUndoCount: number - stack: IModel[] -} diff --git a/src/Constants.ts b/src/Constants.ts deleted file mode 100644 index 7faeb812..00000000 --- a/src/Constants.ts +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @group Error - * @remarks List all errors generated by the backend with their descriptions - */ -export const Error = { - NO_ACTIVITY: "Session closed due to no activity.", - WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey.", - TOO_OLD: "Session is too old. Max Session Duration Reached.", - UNKNOW: "An unknown error has occurred.", - ABNORMAL_CLOSURE: "MyScript recognition server is not reachable.", - CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.", - GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.", - PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error.", - UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)", - INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).", - POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy.", - MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large.", - INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.", - SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting.", - TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.", - BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.", - TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake" -} as const - -/** - * @event - * @remarks Lists all events that can be listened to on the editor or DOM element - */ -export const EventType = { - /** - * @event - * event emitted when history has changed i.e. the context of undo-redo - */ - CHANGED: "changed", - /** - * @event - * event emitted when clearing is complete - */ - CLEARED: "cleared", - /** - * @event - * event emitted after the conversion is complete - */ - CONVERTED: "converted", - /** - * @event - * event emitted when the editor encounters an error - */ - ERROR: "error", - /** - * @event - * event emitted on click on pointer events - */ - POINTEREVENTS: "pointer_events", - /** - * @event - * event emitted after the end of the export - */ - EXPORTED: "exported", - /** - * @event - * event emitted after the end of the import - */ - IMPORTED: "imported", - /** - * @event - * event emitted when the server is idle after a job - */ - IDLE: "idle", - /** - * @event - * event emitted after full editor initialization - */ - LOADED: "loaded", -} as const - -/** - * @internal - */ -export const InternalEventType = { - SVG_PATCH: "internal_svg_patch", - EXPORTED: "internal_exported", - CLEAR_MESSAGE: "internal_clear_message", - ERROR: "internal_error", - NOTIF: "internal_notif", - IMPORT_JIIX: "internal_import_jiix", - CONVERT: "internal_convert", - CLEAR: "internal_clear", - CONTEXT_CHANGE: "internal_context_change", - IDLE: "internal_idle", - WS_CLOSED: "internal_websocket_closed", -} as const - -/** - * @internal - */ -export const WSMessage = { - CLOSE_RECOGNIZER: "CLOSE_RECOGNIZER" -} - -/** - * @group Export - * @remarks List all supported MIME types for export. - * @remarks Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} - */ -export const Exports = { - JIIX: "application/vnd.myscript.jiix", - TEXT: "text/plain", - LATEX: "application/x-latex", - MATHML: "application/mathml+xml", - SVG: "image/svg+xml", - OFFICE_DOCUMENT: "application/vnd.openxmlformats-officedocument.presentationml.presentation" -} as const - -/** - * @group Editor - * @remarks List the possibilities of interactions - */ -export const enum ModeInteraction -{ - Writing = "writing", - Erasing = "erasing", - // Selecting = "selecting" -} - -/** - * @group Constants - */ -export default { - Error, - EventType, - InternalEventType, - Exports, - WSMessage, -} as const diff --git a/src/Editor.ts b/src/Editor.ts deleted file mode 100644 index 9bcda7dc..00000000 --- a/src/Editor.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { TConfiguration } from "./@types/Configuration" -import { IGrabber } from "./@types/grabber/Grabber" -import { TStroke } from "./@types/model/Stroke" -import { IModel, TExport, TJIIXExport } from "./@types/model/Model" -import { TPenStyle } from "./@types/style/PenStyle" -import { TTheme } from "./@types/style/Theme" -import { IBehaviors, TBehaviorOptions } from "./@types/Behaviors" -import { TConverstionState } from "./@types/configuration/RecognitionConfiguration" -import { TMarginConfiguration } from "./@types/configuration/recognition/MarginConfiguration" -import { TUndoRedoContext } from "./@types/undo-redo/UndoRedoContext" - -import { Exports, ModeInteraction } from "./Constants" -import { PublicEvent } from "./event/PublicEvent" -import { InternalEvent } from "./event/InternalEvent" -import { SmartGuide } from "./smartguide/SmartGuide" -import { DeferredPromise } from "./utils/DeferredPromise" -import { RestBehaviors } from "./behaviors/RestBehaviors" -import { WSBehaviors } from "./behaviors/WSBehaviors" - -import "./iink.css" - -export type HTMLEditorElement = HTMLElement & -{ - editor: Editor -} - -export class Editor -{ - wrapperHTML: HTMLEditorElement - #loaderHTML: HTMLDivElement - #messageHTML: HTMLDivElement - #behaviors!: IBehaviors - #smartGuide?: SmartGuide - #initializationDeferred: DeferredPromise - - debug = false - - constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = "ms-editor") - { - this.#initializationDeferred = new DeferredPromise() - - this.wrapperHTML = wrapperHTML as HTMLEditorElement - this.wrapperHTML.classList.add(globalClassCss) - this.events.setElement(this.wrapperHTML) - - this.#loaderHTML = document.createElement("div") - this.#loaderHTML.classList.add("loader") - this.#loaderHTML.style.display = "none" - this.wrapperHTML.appendChild(this.#loaderHTML) - - this.#messageHTML = document.createElement("div") - this.#messageHTML.classList.add("message") - this.#messageHTML.style.display = "none" - this.wrapperHTML.appendChild(this.#messageHTML) - - this.#instantiateBehaviors(options) - this.#addListeners() - } - - get initializationPromise(): Promise - { - return this.#initializationDeferred.promise - } - - get model(): IModel - { - return this.behaviors.model - } - - get behaviors(): IBehaviors - { - return this.#behaviors - } - - get configuration(): TConfiguration - { - return this.behaviors.configuration - } - set configuration(configuration: TConfiguration) - { - this.#instantiateBehaviors({ configuration }) - this.initialize() - } - - get mode(): ModeInteraction - { - return this.behaviors.mode - } - set mode(m: ModeInteraction) - { - this.behaviors.mode = m - switch (this.behaviors.mode) { - case ModeInteraction.Erasing: - this.wrapperHTML.classList.add("erasing") - this.wrapperHTML.classList.remove("selecting") - break - // case ModeInteraction.Selecting: - // this.model.resetSelectedStrokes() - // this.wrapperHTML.classList.remove("erasing") - // this.wrapperHTML.classList.add("selecting") - // break; - default: - document.body.style.cursor = "initial" - this.wrapperHTML.classList.remove("erasing") - this.wrapperHTML.classList.remove("selecting") - break - } - } - - get events(): PublicEvent - { - return PublicEvent.getInstance() - } - - get context(): TUndoRedoContext - { - return this.behaviors.context - } - - get grabber(): IGrabber - { - return this.behaviors.grabber - } - - get currentPenStyle(): TPenStyle - { - return this.behaviors.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.behaviors.penStyle - } - set penStyle(ps: TPenStyle) - { - this.behaviors.setPenStyle(ps) - } - - get theme(): TTheme - { - return this.behaviors.theme - } - set theme(t: TTheme) - { - this.behaviors.setTheme(t) - } - - get penStyleClasses(): string - { - return this.behaviors.penStyleClasses - } - set penStyleClasses(psc: string) - { - this.behaviors.setPenStyleClasses(psc) - } - - #instantiateBehaviors(options: TBehaviorOptions) - { - if (!options?.configuration) { - throw new Error("Configuration required") - } - if (this.#behaviors) { - this.#behaviors.destroy() - } - let defaultBehaviors: IBehaviors - if (options.configuration.server?.protocol === "REST") { - defaultBehaviors = new RestBehaviors(options) - } else { - defaultBehaviors = new WSBehaviors(options) - } - this.#behaviors = Object.assign(defaultBehaviors, options.behaviors) - } - - #initializeBehaviors(): Promise - { - this.#initializationDeferred = new DeferredPromise() - this.#loaderHTML.style.display = "initial" - this.#cleanMessage() - return this.behaviors.init(this.wrapperHTML) - .then(async () => - { - this.wrapperHTML.editor = this - this.#initializationDeferred.resolve() - this.events.emitLoaded() - }) - .catch((e: Error) => - { - this.#initializationDeferred.reject(e) - this.#showError(e) - }) - .finally(() => - { - this.#loaderHTML.style.display = "none" - return this.#initializationDeferred.promise - }) - } - - #initializeSmartGuide(): void - { - this.#smartGuide?.destroy() - if (this.configuration.rendering.smartGuide.enable) { - this.#smartGuide = new SmartGuide() - let margin: TMarginConfiguration - switch (this.configuration.recognition.type) { - case "TEXT": - margin = this.configuration.recognition.text.margin - break - case "MATH": - margin = this.configuration.recognition.math.margin - break - default: - margin = { - top: 20, - left: 10, - right: 10, - bottom: 10 - } - break - } - this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering) - } - } - - #cleanMessage() - { - this.#messageHTML.style.display = "none" - this.#messageHTML.innerHTML = "" - } - - #showError(err: Error) - { - this.#messageHTML.style.display = "initial" - this.#messageHTML.classList.add("error-msg") - this.#messageHTML.classList.remove("info-msg") - this.#messageHTML.innerText = err.message - if (this.debug) { - const pName = document.createElement("p") - pName.innerHTML = err.name - this.#messageHTML.prepend(pName) - - const pStack = document.createElement("p") - pStack.style.width = "50vw" - pStack.style.marginLeft = "calc(-25vw + 100px)" - pStack.innerHTML = err.stack || "" - this.#messageHTML.appendChild(pStack) - } - } - - #showNotif(notif: { message: string, timeout?: number }) - { - this.#messageHTML.style.display = "initial" - this.#messageHTML.classList.add("info-msg") - this.#messageHTML.classList.remove("error-msg") - this.#messageHTML.innerText = notif.message - setTimeout(() => - { - this.#cleanMessage() - }, notif.timeout || 2500) - } - - #showStrokesIfDebug(): void - { - if (this.debug) { - let panel = document.getElementById("stroke-panel") - const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers }))) - if (!panel) { - panel = document.createElement("div") - panel.id = "stroke-panel" - panel.addEventListener("click", () => - { - navigator.clipboard.writeText(panel?.innerText as string) - this.#showNotif({ message: "strokes copied to clipboard!", timeout: 1500 }) - }) - this.wrapperHTML.appendChild(panel) - } - panel.innerText = text - } - } - - #addListeners(): void - { - InternalEvent.getInstance().addConvertListener(this.convert.bind(this)) - InternalEvent.getInstance().addClearListener(this.clear.bind(this)) - InternalEvent.getInstance().addErrorListener(this.#showError.bind(this)) - InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this)) - InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this)) - InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this)) - InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this)) - InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this)) - InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this)) - } - - #onContextChange = (context: TUndoRedoContext) => - { - this.events.emitChanged(context) - } - - #onIdleChange = (idle: boolean) => - { - this.events.emitIdle(idle) - } - - #onExport(exports: TExport): void - { - this.model.mergeExport(exports) - if (this.configuration.rendering.smartGuide.enable) { - if (exports && exports["application/vnd.myscript.jiix"]) { - const jjix = exports["application/vnd.myscript.jiix"] as TJIIXExport - this.#smartGuide?.update(jjix) - } - } - this.#showStrokesIfDebug() - this.events.emitExported(exports) - } - - #onImportJIIX(jiix: TJIIXExport): void - { - this.import(new Blob([JSON.stringify(jiix)], { type: Exports.JIIX }), Exports.JIIX) - } - - async initialize(): Promise - { - await this.#initializeBehaviors() - this.#initializeSmartGuide() - } - - async waitForIdle(): Promise - { - if (this.behaviors.waitForIdle) - { - return this.behaviors.waitForIdle() - } - return - } - - async undo(): Promise - { - await this.#initializationDeferred.promise - await this.behaviors.undo() - this.#showStrokesIfDebug() - return this.model - } - - async redo(): Promise - { - await this.#initializationDeferred.promise - await this.behaviors.redo() - this.#showStrokesIfDebug() - return this.model - } - - async clear(): Promise - { - await this.#initializationDeferred.promise - await this.behaviors.clear() - this.events.emitCleared(this.model) - this.#showStrokesIfDebug() - return this.model - } - - async resize(): Promise - { - await this.#initializationDeferred.promise - if (this.configuration.rendering.smartGuide.enable) { - this.#smartGuide?.resize() - } - const height = Math.max(this.wrapperHTML.clientHeight, this.configuration.rendering.minHeight) - const width = Math.max(this.wrapperHTML.clientWidth, this.configuration.rendering.minWidth) - await this.behaviors.resize(height, width) - return this.model - } - - async export(mimeTypes?: string[]): Promise - { - await this.#initializationDeferred.promise - await this.behaviors.export(mimeTypes) - return this.model - } - - async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise - { - await this.#initializationDeferred.promise - await this.behaviors.convert(params?.conversionState, params?.mimeTypes) - this.events.emitConverted(this.model.converts as TExport) - return this.model - } - - async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise - { - await this.#initializationDeferred.promise - if (this.behaviors.import) { - let blobToImport: Blob - if (data instanceof Blob) { - blobToImport = data - } - else if (typeof data === "string") { - blobToImport = new Blob([data]) - } - else { - blobToImport = new Blob([JSON.stringify(data)]) - } - await this.behaviors.import(blobToImport, mimeType) - this.events.emitImported(this.model.exports as TExport) - return this.model - } - return Promise.reject("Import impossible, behaviors has no import function") - } - - async importPointEvents(strokes: TStroke[]): Promise - { - await this.#initializationDeferred.promise - if (this.behaviors.importPointEvents) { - await this.behaviors.importPointEvents(strokes) - this.events.emitImported(this.model.exports as TExport) - return this.model - } - return Promise.reject("Import impossible, behaviors has no importPointEvents function") - } - -} diff --git a/src/behaviors/RestBehaviors.ts b/src/behaviors/RestBehaviors.ts deleted file mode 100644 index c1830e9b..00000000 --- a/src/behaviors/RestBehaviors.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { IBehaviors, TBehaviorOptions } from "../@types/Behaviors" -import { IModel, TExport } from "../@types/model/Model" -import { TConfiguration } from "../@types/Configuration" -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" -import { TPointer } from "../@types/geometry" - -import { PointerEventGrabber } from "../grabber/PointerEventGrabber" -import { CanvasRenderer } from "../renderer/canvas/CanvasRenderer" -import { RestRecognizer } from "../recognizer/RestRecognizer" -import { DeferredPromise } from "../utils/DeferredPromise" -import { UndoRedoManager } from "../undo-redo/UndoRedoManager" -import { InternalEvent } from "../event/InternalEvent" -import { StyleManager } from "../style/StyleManager" -import { Configuration } from "../configuration/Configuration" -import { Model } from "../model/Model" -import { ModeInteraction } from "../Constants" - -export class RestBehaviors implements IBehaviors -{ - name = "RestBehaviors" - options: TBehaviorOptions - grabber: PointerEventGrabber - renderer: CanvasRenderer - recognizer: RestRecognizer - undoRedoManager: UndoRedoManager - styleManager: StyleManager - #configuration: TConfiguration - #model: IModel - mode: ModeInteraction - - #resizeTimer?: ReturnType - #exportTimer?: ReturnType - - constructor(options: TBehaviorOptions) - { - this.options = options - this.#configuration = new Configuration(options?.configuration) - this.styleManager = new StyleManager(options.penStyle, options.theme) - - this.grabber = new PointerEventGrabber(this.#configuration.grabber) - this.renderer = new CanvasRenderer(this.#configuration.rendering) - this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition) - - this.mode = ModeInteraction.Writing - this.#model = new Model() - this.undoRedoManager = new UndoRedoManager(this.#configuration["undo-redo"], this.model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - get model(): IModel - { - return this.#model - } - - get context(): TUndoRedoContext - { - return this.undoRedoManager.context - } - - get currentPenStyle(): TPenStyle - { - return this.styleManager.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.styleManager.penStyle - } - setPenStyle(ps?: TPenStyle) - { - this.styleManager.setPenStyle(ps) - } - - get penStyleClasses(): string - { - return this.styleManager.penStyleClasses - } - setPenStyleClasses(psc?: string) - { - this.styleManager.setPenStyleClasses(psc) - } - - get theme(): TTheme - { - return this.styleManager.theme - } - setTheme(t?: TTheme) - { - this.styleManager.setTheme(t) - } - - get configuration(): TConfiguration - { - return this.#configuration - } - - async init(domElement: HTMLElement): Promise - { - this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth) - this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight) - this.undoRedoManager.updateModelInStack(this.model) - - this.renderer.init(domElement) - - this.grabber.attach(domElement) - this.grabber.onPointerDown = this.onPointerDown.bind(this) - this.grabber.onPointerMove = this.onPointerMove.bind(this) - this.grabber.onPointerUp = this.onPointerUp.bind(this) - } - - private onPointerDown(evt: PointerEvent, point: TPointer): void - { - const { pointerType } = evt - const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle) - switch (this.mode) { - case ModeInteraction.Erasing: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(model => Object.assign(this.model, model)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - default: - this.model.initCurrentStroke(point, evt.pointerId, pointerType, style) - this.drawCurrentStroke() - break - } - } - - private onPointerMove(_evt: PointerEvent, point: TPointer): void - { - switch (this.mode) { - case ModeInteraction.Erasing: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - default: - this.model.appendToCurrentStroke(point) - this.drawCurrentStroke() - break - } - } - - private onPointerUp(_evt: PointerEvent, point: TPointer): void - { - switch (this.mode) { - case ModeInteraction.Erasing: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - default: - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - break - } - } - - drawCurrentStroke(): void - { - this.renderer.drawPendingStroke(this.model.currentStroke) - } - - async updateModelRendering(): Promise - { - this.renderer.drawModel(this.model) - const deferred = new DeferredPromise() - this.undoRedoManager.addModelToStack(this.model) - if (this.#configuration.triggers.exportContent !== "DEMAND") { - clearTimeout(this.#exportTimer) - let currentModel = this.model.getClone() - this.#exportTimer = setTimeout(async () => - { - try { - currentModel = await this.recognizer.export(currentModel) - this.undoRedoManager.updateModelInStack(currentModel) - if (this.model.modificationDate === currentModel.modificationDate) { - this.model.exports = currentModel.exports - } - deferred.resolve(this.model) - } catch (error) { - deferred.reject(error as Error) - } - }, this.#configuration.triggers.exportContent === "QUIET_PERIOD" ? this.#configuration.triggers.exportContentDelay : 0) - } else { - deferred.resolve(this.model) - } - await deferred.promise - this.internalEvent.emitExported(this.model.exports as TExport) - return deferred.promise - } - - async export(mimeTypes?: string[]): Promise - { - const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes) - if (this.model.modificationDate === newModel.modificationDate) { - this.model.mergeExport(newModel.exports as TExport) - } - this.undoRedoManager.updateModelInStack(newModel) - return this.model - } - - async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - { - const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes) - Object.assign(this.#model, newModel) - return this.model - } - - async resize(height: number, width: number): Promise - { - const deferredResize = new DeferredPromise() - this.model.height = height - this.model.width = width - this.renderer.resize(this.model) - if (this.model.rawStrokes.length) { - clearTimeout(this.#resizeTimer) - this.#resizeTimer = setTimeout(async () => - { - const resizeModel = await this.recognizer.resize(this.model) - deferredResize.resolve(resizeModel) - }, this.#configuration.triggers.resizeTriggerDelay) - } else { - deferredResize.resolve(this.model) - } - const newModel = await deferredResize.promise - this.internalEvent.emitExported(newModel.exports as TExport) - return newModel - } - - async undo(): Promise - { - this.#model = this.undoRedoManager.undo() - this.renderer.drawModel(this.#model) - this.#model = await this.recognizer.export(this.#model) - this.undoRedoManager.updateModelInStack(this.#model) - this.internalEvent.emitExported(this.#model.exports as TExport) - return this.#model - } - - async redo(): Promise - { - this.#model = this.undoRedoManager.redo() - this.renderer.drawModel(this.#model) - this.#model = await this.recognizer.export(this.#model) - this.undoRedoManager.updateModelInStack(this.#model) - this.internalEvent.emitExported(this.#model.exports as TExport) - return this.#model - } - - async clear(): Promise - { - this.model.clear() - this.undoRedoManager.addModelToStack(this.model) - this.renderer.drawModel(this.model) - this.internalEvent.emitExported(this.model.exports as TExport) - return this.model - } - - async destroy(): Promise - { - this.grabber.detach() - this.renderer.destroy() - return Promise.resolve() - } -} diff --git a/src/behaviors/WSBehaviors.ts b/src/behaviors/WSBehaviors.ts deleted file mode 100644 index e6e88835..00000000 --- a/src/behaviors/WSBehaviors.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { IBehaviors, TBehaviorOptions } from "../@types/Behaviors" -import { TConfiguration } from "../@types/Configuration" -import { IModel, TExport } from "../@types/model/Model" -import { TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TStroke } from "../@types/model/Stroke" -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TTheme } from "../@types/style/Theme" -import { TPenStyle } from "../@types/style/PenStyle" -import { TPointer } from "../@types/geometry" - -import { PointerEventGrabber } from "../grabber/PointerEventGrabber" -import { WSRecognizer } from "../recognizer/WSRecognizer" -import { ModeInteraction, WSMessage } from "../Constants" -import { InternalEvent } from "../event/InternalEvent" -import { DeferredPromise } from "../utils/DeferredPromise" -import { WSSVGRenderer } from "../renderer/svg/WSSVGRenderer" -import { StyleManager } from "../style/StyleManager" -import { Configuration } from "../configuration/Configuration" -import { Model } from "../model/Model" - -export class WSBehaviors implements IBehaviors -{ - name = "WSBehaviors" - options: TBehaviorOptions - grabber: PointerEventGrabber - renderer: WSSVGRenderer - recognizer: WSRecognizer - context: TUndoRedoContext - styleManager: StyleManager - #configuration: TConfiguration - #model: IModel - mode: ModeInteraction - - #resizeTimer?: ReturnType - - constructor(options: TBehaviorOptions) - { - this.options = options - this.#configuration = new Configuration(options?.configuration) - this.styleManager = new StyleManager(options.penStyle, options.theme) - - this.grabber = new PointerEventGrabber(this.#configuration.grabber) - this.renderer = new WSSVGRenderer(this.#configuration.rendering) - this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition) - - this.mode = ModeInteraction.Writing - this.#model = new Model() - this.context = { - canRedo: false, - canUndo: false, - empty: true, - stackIndex: -1, - possibleUndoCount: 0, - stack: [] - } - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - get model(): IModel - { - return this.#model - } - - get configuration(): TConfiguration - { - return this.#configuration - } - - get currentPenStyle(): TPenStyle - { - return this.styleManager.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.styleManager.penStyle - } - setPenStyle(ps?: TPenStyle): Promise - { - this.styleManager.setPenStyle(ps) - return this.recognizer.setPenStyle(this.styleManager.penStyle) - } - - get penStyleClasses(): string - { - return this.styleManager.penStyleClasses - } - setPenStyleClasses(psc?: string): Promise - { - this.styleManager.setPenStyleClasses(psc) - return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses) - } - - get theme(): TTheme - { - return this.styleManager.theme - } - setTheme(t: TTheme): Promise - { - this.styleManager.setTheme(t) - return this.recognizer.setTheme(this.styleManager.theme) - } - - async init(domElement: HTMLElement): Promise - { - this.#model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth) - this.#model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight) - this.context.stack.push(this.model.getClone()) - this.context.stackIndex = 0 - - this.renderer.init(domElement) - - this.grabber.attach(domElement) - this.grabber.onPointerDown = this.onPointerDown.bind(this) - this.grabber.onPointerMove = this.onPointerMove.bind(this) - this.grabber.onPointerUp = this.onPointerUp.bind(this) - - this.internalEvent.addSVGPatchListener(this.onSVGPatch) - this.internalEvent.addContextChangeListener(this.onContextChange) - - await this.recognizer.init(this.#model.height, this.#model.width) - await this.setPenStyle(this.penStyle) - await this.setTheme(this.theme) - await this.setPenStyleClasses(this.penStyleClasses) - } - - private onPointerDown(evt: PointerEvent, point: TPointer): void - { - let { pointerType } = evt - const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle) - if (this.mode === ModeInteraction.Erasing) { - pointerType = "eraser" - } - this.model.initCurrentStroke(point, evt.pointerId, pointerType, style) - this.drawCurrentStroke() - } - - private onPointerMove(_evt: PointerEvent, point: TPointer): void - { - this.model.appendToCurrentStroke(point) - this.drawCurrentStroke() - } - - private onPointerUp(_evt: PointerEvent, point: TPointer): void - { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - - private onSVGPatch = (evt: TWebSocketSVGPatchEvent) => - { - this.renderer.updatesLayer(evt.layer, evt.updates) - } - - private onContextChange = (context: TUndoRedoContext) => - { - this.context.canRedo = context.canRedo - this.context.canUndo = context.canUndo - this.context.empty = context.empty - this.context.possibleUndoCount = context.possibleUndoCount - this.context.stackIndex = context.stackIndex - } - - drawCurrentStroke(): void - { - const currentStroke = this.model.currentStroke as TStroke - if (currentStroke) { - this.renderer.drawPendingStroke(currentStroke) - } - } - - async updateModelRendering(): Promise - { - this.context.stack.push(this.model.getClone()) - if (this.#configuration.triggers.exportContent !== "DEMAND") { - const updatedModel = await this.recognizer.addStrokes(this.model) - this.model.mergeExport(updatedModel.exports as TExport) - } - return this.model - } - - async waitForIdle?(): Promise - { - return this.recognizer.waitForIdle() - } - - async importPointEvents(strokes: TStroke[]): Promise - { - const exportPoints = await this.recognizer.importPointEvents(strokes) - this.model.mergeExport(exportPoints) - return this.model - } - - async export(mimeTypes?: string[]): Promise - { - try { - if (this.#configuration.triggers.exportContent === "DEMAND") { - return this.recognizer.addStrokes(this.model) - } else { - return this.recognizer.export(this.model, mimeTypes) - } - } catch (error) { - this.internalEvent.emitError(error as Error) - return Promise.reject(error) - } - } - - async convert(conversionState?: TConverstionState): Promise - { - this.context.stack.push(this.model.getClone()) - this.#model = await this.recognizer.convert(this.model, conversionState) - return this.model - } - - async import(data: Blob, mimeType?: string): Promise - { - this.context.stack.push(this.model.getClone()) - return this.recognizer.import(this.model, data, mimeType) - } - - async resize(height: number, width: number): Promise - { - const deferredResize = new DeferredPromise() - this.model.height = height - this.model.width = width - const clonedModel = this.model.getClone() - this.renderer.resize(clonedModel) - clearTimeout(this.#resizeTimer) - this.#resizeTimer = setTimeout(async () => - { - try { - const resizeModel = await this.recognizer.resize(clonedModel) - deferredResize.resolve(resizeModel) - } catch (error) { - deferredResize.reject(error as Error) - } - }, this.#configuration.triggers.resizeTriggerDelay) - - this.#model = await deferredResize.promise - this.internalEvent.emitExported(this.model.exports as TExport) - return this.model - } - - async undo(): Promise - { - if (this.context.canUndo) { - this.#model = this.context.stack[this.context.stackIndex - 1] - return this.recognizer.undo(this.#model) - } - else { - throw new Error("Undo not allowed") - } - } - - async redo(): Promise - { - if (this.context.canRedo) { - this.#model = this.context.stack[this.context.stackIndex + 1] - return this.recognizer.redo(this.#model) - } - else { - throw new Error("Redo not allowed") - } - } - - async clear(): Promise - { - this.model.clear() - this.context.stack.push(this.model.getClone()) - return this.recognizer.clear(this.model) - } - - async destroy(): Promise - { - this.grabber.detach() - this.renderer.destroy() - this.recognizer.close(1000, WSMessage.CLOSE_RECOGNIZER) - return Promise.resolve() - } -} diff --git a/src/behaviors/index.ts b/src/behaviors/index.ts deleted file mode 100644 index 02009593..00000000 --- a/src/behaviors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RestBehaviors } from "./RestBehaviors" -export { WSBehaviors } from "./WSBehaviors" diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts deleted file mode 100644 index e5668b83..00000000 --- a/src/configuration/Configuration.ts +++ /dev/null @@ -1,81 +0,0 @@ - -import { TConfiguration, TConfigurationClient } from "../@types/Configuration" -import { TEventConfiguration } from "../@types/configuration/EventConfiguration" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { TTriggerConfiguration } from "../@types/configuration/TriggerConfiguration" -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { DefaultConfiguration } from "./DefaultConfiguration" -import { mergeDeep } from "../utils/MergeHelper" - -export class Configuration implements TConfiguration -{ - events: TEventConfiguration - grabber: TGrabberConfiguration - recognition: TRecognitionConfiguration - rendering: TRenderingConfiguration - server: TServerConfiguration - triggers: TTriggerConfiguration - "undo-redo": TUndoRedoConfiguration - - constructor(configuration?: TConfigurationClient) - { - this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events)) - this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber)) - this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition)) - this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering)) - this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server)) - this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers)) - - this.overrideDefaultConfiguration(configuration) - } - - - - overrideDefaultConfiguration(configuration?: TConfigurationClient): void - { - const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration)) - this.events = mergeDeep({}, defaultConf.events, configuration?.events) - this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber) - this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition) - this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering) - this.server = mergeDeep({}, defaultConf.server, configuration?.server) - this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers) - this["undo-redo"] = mergeDeep({}, defaultConf["undo-redo"], configuration?.["undo-redo"]) - - this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes - this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes - this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes - - if (this.server?.useWindowLocation) { - this.server.scheme = window.location.protocol.indexOf("s") > -1 ? "https" : "http" - this.server.host = window.location.host - } - - if ( - this.server.protocol === "REST" && - this.triggers.exportContent === "POINTER_UP" - ) { - this.triggers.exportContent = "QUIET_PERIOD" - this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50) - } - - if ( - this.server.protocol === "WEBSOCKET" && - this.recognition.type === "TEXT" - ) { - if ( - this.rendering.smartGuide.enable && - !this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix") - ) { - // mimeType required for smartGuide - this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix") - } - } else { - // smartGuide enable only on websocket text - this.rendering.smartGuide.enable = false - } - } -} diff --git a/src/configuration/DefaultConfiguration.ts b/src/configuration/DefaultConfiguration.ts deleted file mode 100644 index 43af0835..00000000 --- a/src/configuration/DefaultConfiguration.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { TConfiguration } from "../@types/Configuration" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TTriggerConfiguration } from "../@types/configuration/TriggerConfiguration" -import { TEventConfiguration } from "../@types/configuration/EventConfiguration" -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" - -export const DefaultServerConfiguration: TServerConfiguration = { - protocol: "WEBSOCKET", - scheme: "https", - host: "cloud.myscript.com", - applicationKey: "", - hmacKey: "", - version: "2.1.0", - useWindowLocation: false, - websocket: { - pingEnabled: true, - pingDelay: 30000, - maxPingLostCount: 10, - autoReconnect: true, - maxRetryCount: 2, - fileChunkSize: 300000 - } -} - -export const DefaultRecognitionConfiguration: TRecognitionConfiguration = { - type: "TEXT", - alwaysConnected: true, - lang: "en_US", - gesture: { - enable: true - }, - export: { - "image-resolution": 300, - jiix: { - "bounding-box": false, - strokes: false, - text: { - chars: false, - words: true - } - }, - }, - renderer: { - debug: { - "draw-text-boxes": false, - "draw-image-boxes": false - } - }, - math: { - mimeTypes: ["application/vnd.myscript.jiix"], // "application/mathml+xml", "application/x-latex" , - solver: { - enable: true, - "fractional-part-digits": 3, - "decimal-separator": ".", - "rounding-mode": "half up", - "angle-unit": "deg" - }, - margin: { - bottom: 10, - left: 15, - right: 15, - top: 10 - }, - eraser: { - "erase-precisely": false - }, - "undo-redo": { - mode: "stroke" - } - }, - text: { - guides: { - enable: true - }, - mimeTypes: ["application/vnd.myscript.jiix"], // "text/plain" - margin: { - top: 20, - left: 10, - right: 10, - bottom: 10 - }, - eraser: { - "erase-precisely": false - } - }, - diagram: { - mimeTypes: ["application/vnd.myscript.jiix"], // "application/vnd.openxmlformats-officedocument.presentationml.presentation" - eraser: { - "erase-precisely": false - }, - convert: { - "match-text-size": true - } - }, - "raw-content": { - recognition: { - text: true, - shape: true - }, - eraser: { - "erase-precisely": false - } - } -} - -export const DefaultGrabberConfiguration: TGrabberConfiguration = { - listenerOptions: { - capture: false, - passive: true - }, - xyFloatPrecision: 0, - timestampFloatPrecision: 0 -} - -export const DefaultRenderingConfiguration: TRenderingConfiguration = { - minHeight: 100, - minWidth: 100, - smartGuide: { - enable: true, - fadeOut: { - enable: false, - duration: 5000 - } - }, - guides: { - enable: true, - gap: 50 - } -} - -export const DefaultTriggerConfiguration: TTriggerConfiguration = { - exportContent: "POINTER_UP", - exportContentDelay: 1000, - resizeTriggerDelay: 100 -} - -export const DefaultEventsConfiguration: TEventConfiguration = { - processDelay: 10 -} - -export const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = { - maxStackSize: 100 -} - -export const DefaultConfiguration: TConfiguration = { - server: DefaultServerConfiguration, - recognition: DefaultRecognitionConfiguration, - grabber: DefaultGrabberConfiguration, - rendering: DefaultRenderingConfiguration, - triggers: DefaultTriggerConfiguration, - events: DefaultEventsConfiguration, - "undo-redo": DefaultUndoRedoConfiguration -} diff --git a/src/configuration/index.ts b/src/configuration/index.ts deleted file mode 100644 index 51f2786b..00000000 --- a/src/configuration/index.ts +++ /dev/null @@ -1,3 +0,0 @@ - -export { Configuration } from "./Configuration" -export * from "./DefaultConfiguration" diff --git a/src/event/InternalEvent.ts b/src/event/InternalEvent.ts deleted file mode 100644 index ef735418..00000000 --- a/src/event/InternalEvent.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TExport, TJIIXExport } from "../@types/model/Model" -import { TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { InternalEventType } from "../Constants" - -export class InternalEvent extends EventTarget -{ - static #instance: InternalEvent - #abortController: AbortController - - private constructor() - { - super() - this.#abortController = new AbortController() - } - - public static getInstance(): InternalEvent - { - if (!InternalEvent.#instance) { - InternalEvent.#instance = new InternalEvent() - } - - return InternalEvent.#instance - } - - removeAllListeners(): void - { - this.#abortController.abort() - } - - #emit(type: string, data?: unknown): void - { - this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))) - } - - emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void - { - this.#emit(InternalEventType.SVG_PATCH, patchChange) - } - addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void - { - this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal }) - } - - emitExported(exports: TExport): void - { - this.#emit(InternalEventType.EXPORTED, exports) - } - addExportedListener(callback: (exports: TExport) => void): void - { - this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal }) - } - - emitClearMessage(): void - { - this.#emit(InternalEventType.CLEAR_MESSAGE) - } - addClearMessageListener(callback: () => void): void - { - this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal }) - } - - emitError(err: Error): void - { - this.#emit(InternalEventType.ERROR, err) - } - addErrorListener(callback: (err: Error) => void): void - { - this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal }) - } - - emitWSClosed(): void - { - this.#emit(InternalEventType.WS_CLOSED) - } - addWSClosedListener(callback: () => void): void - { - this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal }) - } - - emitNotif(notif: { message: string, timeout?: number }): void - { - this.#emit(InternalEventType.NOTIF, notif) - } - addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void - { - this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal }) - } - - emitImportJIIX(jiix: TJIIXExport): void - { - this.#emit(InternalEventType.IMPORT_JIIX, jiix) - } - addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void - { - this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal }) - } - - emitConvert(conversionState: TConverstionState = "DIGITAL_EDIT"): void - { - this.#emit(InternalEventType.CONVERT, conversionState) - } - addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void - { - this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal }) - } - - emitClear(): void - { - this.#emit(InternalEventType.CLEAR) - } - addClearListener(callback: () => void): void - { - this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal }) - } - - emitContextChange(context: TUndoRedoContext): void - { - this.#emit(InternalEventType.CONTEXT_CHANGE, context) - } - addContextChangeListener(callback: (context: TUndoRedoContext) => void): void - { - this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal }) - } - - emitIdle(idle: boolean): void - { - this.#emit(InternalEventType.IDLE, idle) - } - addIdleListener(callback: (idle: boolean) => void): void - { - this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal }) - } -} diff --git a/src/event/PublicEvent.ts b/src/event/PublicEvent.ts deleted file mode 100644 index a54b6dab..00000000 --- a/src/event/PublicEvent.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { IModel, TExport } from "../@types/model/Model" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { EventType } from "../Constants" - -export class PublicEvent extends EventTarget -{ - static #instance: PublicEvent - #element?: HTMLElement - - private constructor() - { - super() - } - - public static getInstance(): PublicEvent - { - if (!PublicEvent.#instance) { - PublicEvent.#instance = new PublicEvent() - } - - return PublicEvent.#instance - } - - setElement(el: HTMLElement) - { - this.#element = el - } - - #emit(type: string, data?: unknown): void - { - const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)) - this.dispatchEvent(evt) - this.#element?.dispatchEvent(evt) - } - - emitLoaded(): void - { - this.#emit(EventType.LOADED) - } - - emitExported(exports: TExport): void - { - this.#emit(EventType.EXPORTED, exports) - } - - emitChanged(undoRedoContext: TUndoRedoContext): void - { - this.#emit(EventType.CHANGED, { - ...undoRedoContext, - canClear: !undoRedoContext.empty - }) - } - - emitIdle(idle: boolean): void - { - this.#emit(EventType.IDLE, idle) - } - - emitCleared(model?: IModel): void - { - this.#emit(EventType.CLEARED, model) - } - - emitConverted(exports: TExport): void - { - this.#emit(EventType.CONVERTED, exports) - } - - emitImported(exports: TExport): void - { - this.#emit(EventType.IMPORTED, exports) - } -} diff --git a/src/event/index.ts b/src/event/index.ts deleted file mode 100644 index 93c6f6c6..00000000 --- a/src/event/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { InternalEvent } from "./InternalEvent" -export { PublicEvent } from "./PublicEvent" diff --git a/src/grabber/PointerEventGrabber.ts b/src/grabber/PointerEventGrabber.ts deleted file mode 100644 index 4aac6565..00000000 --- a/src/grabber/PointerEventGrabber.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { IGrabber } from "../@types/grabber/Grabber" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TPointer } from "../@types/geometry" - -export class PointerEventGrabber implements IGrabber -{ - private configuration: TGrabberConfiguration - - private domElement!: HTMLElement - - private activePointerId?: number - - private prevent = (e: Event) => e.preventDefault() - - onPointerDown!: (evt: PointerEvent, point: TPointer) => void - onPointerMove!: (evt: PointerEvent, point: TPointer) => void - onPointerUp!: (evt: PointerEvent, point: TPointer) => void - - constructor(configuration: TGrabberConfiguration) - { - this.configuration = configuration - } - - private roundFloat(oneFloat: number, requestedFloatPrecision: number): number - { - if (requestedFloatPrecision >= 0) { - const floatPrecision: number = Math.pow(10, requestedFloatPrecision) - return Math.round(oneFloat / floatPrecision) * floatPrecision - } - return oneFloat - } - - private extractPoint(event: MouseEvent | TouchEvent): TPointer - { - let clientX: number, clientY: number - if ("changedTouches" in event) { - ({ clientX, clientY } = event.changedTouches[0]) - } else { - ({ clientX, clientY } = event) - } - const rect: DOMRect = this.domElement.getBoundingClientRect() - return { - x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision), - y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision), - t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision), - p: (event as PointerEvent).pressure || 1, - - } - } - - private pointerDownHandler = (evt: PointerEvent) => - { - // exit if not a left click or multi-touch - if (evt.button !== 0 || evt.buttons !== 1) { - return - } - - this.activePointerId = evt.pointerId - - if (this.onPointerDown) { - const point = this.extractPoint(evt) - this.onPointerDown(evt, point) - } - } - - private pointerMoveHandler = (evt: PointerEvent) => - { - if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) { - if (this.onPointerMove) { - const point = this.extractPoint(evt) - this.onPointerMove(evt, point) - } - } - } - - private pointerUpHandler = (evt: PointerEvent) => - { - if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) { - this.activePointerId = undefined - evt.stopPropagation() - if (this.onPointerUp) { - const point = this.extractPoint(evt) - this.onPointerUp(evt, point) - } - } - } - - attach(domElement: HTMLElement) - { - if (this.domElement) { - this.detach() - } - this.domElement = domElement - this.domElement.addEventListener("pointerdown", this.pointerDownHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointermove", this.pointerMoveHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointerup", this.pointerUpHandler, this.configuration.listenerOptions) - // this.domElement.addEventListener("pointerout", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointerleave", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointercancel", this.pointerUpHandler, this.configuration.listenerOptions) - - this.domElement.addEventListener("touchmove", this.prevent) - - // FIXME investigate why this is needed for iOS devices - // eslint-disable-next-line @typescript-eslint/no-empty-function - document.documentElement.addEventListener("pointerdown", () => { }) - } - - detach() - { - this.domElement?.removeEventListener("pointerdown", this.pointerDownHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointermove", this.pointerMoveHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointerup", this.pointerUpHandler, this.configuration.listenerOptions) - // this.domElement?.removeEventListener("pointerout", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointerleave", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointercancel", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("touchmove", this.prevent) - // eslint-disable-next-line @typescript-eslint/no-empty-function - document.documentElement.removeEventListener("pointerdown", () => { }) - } -} diff --git a/src/iink.css b/src/iink.css deleted file mode 100644 index 516dd84c..00000000 --- a/src/iink.css +++ /dev/null @@ -1,328 +0,0 @@ -.ms-editor { - position: relative; - z-index: 10; - color: #1A9FFF; - font-family: sans-serif; -} - -.ms-editor.erasing { - cursor: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=') 10 10, auto; -} - -.ms-editor canvas, -.ms-editor svg { - z-index: 20; - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; -} - -.ms-editor canvas.ms-rendering-canvas { - z-index: 9; - pointer-events: none; - background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px); - background-size: 18px 18px; -} - -.ms-editor .loader { - z-index: 30; - position: absolute; - width: 120px; - height: 120px; - top: calc(50% - 60px); - left: calc(50% - 60px); - border: 16px solid #F5F6F7; - border-radius: 50%; - border-top-color: #1A9FFF; - -webkit-animation: spin 2s linear infinite; - animation: spin 2s linear infinite; -} - -.ms-editor .message { - z-index: 25; - position: absolute; - width: 300px; - max-height: calc(25%); - min-height: 200px; - top: calc(50% - 100px); - left: calc(50% - 150px); - font-size: 16px; - text-align: center; - word-wrap: break-word; -} - -.ms-editor .message.error-msg::before { - content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo="); -} - -.ms-editor .message.info-msg::before { - content: ""; - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");; - background-size: 100% 100%; - display: block; - margin: auto; - padding-bottom: 10px; - height: 25px; - width: 25px; -} - -.ms-editor .smartguide { - position: absolute; - z-index: 40; - font-size: 16px; - height: 48px; - line-height: 48px; -} - -.ms-editor .smartguide.smartguide-in { - visibility: visible !important; - transition: opacity 0.5s; - opacity: 1; -} - -.ms-editor .smartguide.smartguide-out { - transition: opacity 1s, visibility 1s; - visibility: hidden !important; - opacity: 0; -} - -.ms-editor .smartguide .tag-icon { - padding: 0 18px; - border: 1px solid #959DA6; - font-weight: bold; - font-size: large; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - position: absolute; - z-index: 31; - height: 100%; - line-height: 48px; - background-color: rgba(255, 255, 255, 0.9); - color: #959DA6; -} - -.ms-editor .smartguide .ellipsis { - cursor: pointer; - border-bottom: 1px solid #959DA6; - position: absolute; - z-index: 31; - height: 48px; - line-height: 38px; - padding: 0 8px; - font-weight: bold; - font-size: x-large; - background-color: rgba(255, 255, 255, 0.9); - color: #959DA6; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .ellipsis:active { - background-color: #e0e0e0; -} - -.ms-editor .smartguide .prompter-container { - background-color: rgba(255, 255, 255, 0.9); - height: 48px; - line-height: 48px; - overflow: hidden; - white-space: nowrap; - display: block; - text-align: left; - border-bottom: 1px solid #959DA6; - position: absolute; - z-index: 30; - color: #bfbfbf; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .prompter-container > div > span { - cursor: pointer; - display: inline-block; -} - -.ms-editor .smartguide .prompter-container .prompter-text { - margin-left: 12px; -} - -.ms-editor .smartguide .prompter-container .prompter-text .added-word { - animation: 0.1s linear word-added, - 3s ease-in-out color-input; -} - -.ms-editor .smartguide .prompter-container .prompter-text .modified-word { - animation: 0.1s linear word-modified, - 3s ease-in-out color-input; -} - -.ms-editor .smartguide .candidates { - color: black; - flex-direction: column; - text-align: center; - line-height: 30px; - border-radius: 3px; - position: absolute; - box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD; - background-color: #F5F5F5; - z-index: 100; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .candidates > span { - cursor: pointer; - padding: 2px 20px; -} - -.ms-editor .smartguide .candidates > span:hover { - background-color: #EEEEEE; -} - -.ms-editor .smartguide .candidates > span:active { - background-color: #E0E0E0; -} - -.ms-editor .smartguide .candidates .selected-word { - font-weight: bold; - background-color: #E0E0E0; -} - -.ms-editor .smartguide .more-menu { - display: flex; - flex-direction: column; - margin-right: 12px; - line-height: 30px; - border-radius: 3px; - position: absolute; - z-index: 100; - box-shadow: 2px 2px 12px #BDBDBD; - background-color: #F5F5F5; - overflow: hidden; - transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear; -} -.ms-editor .smartguide .more-menu.open { - max-height: 500px; - visibility: visible; - opacity: 1; -} -.ms-editor .smartguide .more-menu.close { - max-height: 0; - visibility: hidden; - opacity: 0; -} - -.ms-editor .smartguide .more-menu .options-label-button { - color: black; - font-size: 16px; - cursor: pointer; - box-sizing: border-box; - background: transparent; - border: none; - padding: 0 24px; - margin: 0; - height: 40px; - outline: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .more-menu .options-label-button:hover { - background-color: #EEEEEE; -} - -.ms-editor .smartguide .more-menu .options-label-button:active { - background-color: #E0E0E0; -} - -.ms-editor .ps__rail-x { - top: 32px !important; -} - -.ms-editor #stroke-panel { - position: fixed; - bottom: 10px; - left: 10px; - right: 10px; - background-color: white; - border: solid black 2px; - padding: 5px; - word-wrap: break-word; - overflow: auto; - cursor: copy; - max-height: 100px; - z-index: 999; -} - -/** Stroke **/ - -.ms-editor .removed-stroke { - opacity: 0; - transition: opacity 0.1s ease-in-out; -} - -.ms-editor .added-stroke { - animation: 0.2s opacity-appear; -} - -@keyframes color-input { - 0% { - color: black; - } - 100% { - color: #bfbfbf; - } -} - -@keyframes word-added { - 0% { - transform: translate(5px, 0); - } - 100% { - transform: none; - } -} - -@keyframes word-modified { - 0% { - transform: translate(0, 5px); - } - 100% { - transform: none; - } -} - -@keyframes opacity-appear { - 0% { - opacity: 0; - } - 100% { - opacity : 1; - } -} - -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} diff --git a/src/iink.ts b/src/iink.ts deleted file mode 100644 index b5c81b6f..00000000 --- a/src/iink.ts +++ /dev/null @@ -1,47 +0,0 @@ - -export { Editor } from "./Editor" - -export { DeferredPromise, geometric, getAvailableFontList, getAvailableLanguageList, version } from "./utils" - -export { default as Constants, ModeInteraction } from "./Constants" - -export -{ - DefaultConfiguration, - DefaultEventsConfiguration, - DefaultGrabberConfiguration, - DefaultRecognitionConfiguration, - DefaultRenderingConfiguration, - DefaultServerConfiguration, - DefaultTriggerConfiguration, - DefaultUndoRedoConfiguration, - Configuration -} from "./configuration" - -export { RestBehaviors, WSBehaviors } from "./behaviors" - -export { RestRecognizer, WSRecognizer, computeHmac } from "./recognizer" - -export -{ - CanvasRenderer, - CanvasStroker, - SVGStroker, - WSSVGRenderer, - canvasRendererShape, - canvasRendererStroke, - canvasRendererText, - quadradicsUtils -} from "./renderer" - -export { PointerEventGrabber } from "./grabber/PointerEventGrabber" - -export { DefaultPenStyle, DefaultTheme, StyleHelper, StyleManager } from "./style" - -export { Model, Stroke, convertStrokeToJSON } from "./model" - -export { UndoRedoContext, UndoRedoManager } from "./undo-redo" - -export { InternalEvent, PublicEvent } from "./event" - -export { SmartGuide } from "./smartguide/SmartGuide" diff --git a/src/model/Model.ts b/src/model/Model.ts deleted file mode 100644 index 759066c9..00000000 --- a/src/model/Model.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" -import { TPoint, TPointer } from "../@types/geometry" -import { TStroke } from "../@types/model/Stroke" -import { IModel, TExport } from "../@types/model/Model" -import { TRecognitionPositions } from "../@types/model/RecognitionPositions" - -import { computeDistance } from "../utils/geometric" -import { Stroke } from "./Stroke" - -export class Model implements IModel -{ - readonly creationTime: number - modificationDate: number - currentStroke?: TStroke - positions: TRecognitionPositions - rawStrokes: TStroke[] - selectedStrokes: TStroke[] - exports?: TExport - converts?: TExport - width: number - height: number - idle: boolean - - constructor(width = 100, height = 100, creationDate: number = Date.now()) - { - this.creationTime = creationDate - this.modificationDate = creationDate - this.width = width - this.height = height - this.rawStrokes = [] - this.selectedStrokes = [] - this.positions = { - lastSentPosition: 0, - lastReceivedPosition: 0 - } - this.idle = true - } - - mergeExport(exports: TExport) - { - if (this.exports) { - Object.assign(this.exports, exports) - } else { - this.exports = exports - } - } - - mergeConvert(converts: TExport) - { - if (this.converts) { - Object.assign(this.converts, converts) - } else { - this.converts = converts - } - } - - private computePressure(distance: number, globalDistance: number): number - { - let ratio = 1.0 - if (globalDistance === 0) { - ratio = 0.5 - } else if (distance === globalDistance) { - ratio = 1.0 - } else if (distance < 10) { - ratio = 0.2 + Math.pow(0.1 * distance, 0.4) - } else if (distance > globalDistance - 10) { - ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4) - } - const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance))) - return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100 - } - - private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean - { - const delta: number = (2 + ((stroke.style["-myscript-pen-width"] || 0) / 4)) - return !lastPointer || - stroke.pointers.length === 0 || - Math.abs(lastPointer.x - point.x) >= delta || - Math.abs(lastPointer.y - point.y) >= delta - } - - addPoint(stroke: TStroke, pointer: TPointer): void - { - const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 } - if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) { - const distance = computeDistance(pointer, lastPointer) - stroke.length += distance - pointer.p = this.computePressure(distance, stroke.length) - stroke.pointers.push(pointer) - } - } - - addStroke(stroke: TStroke): void - { - this.rawStrokes.push(stroke) - } - - extractUnsentStrokes(): TStroke[] - { - return this.rawStrokes.slice(this.positions.lastSentPosition) - } - - initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void - { - if (style["-myscript-pen-width"]) { - const pxWidth = (style["-myscript-pen-width"] * dpi) / 25.4 - style.width = pxWidth / 2 - } - this.modificationDate = Date.now() - this.exports = undefined - this.converts = undefined - this.currentStroke = new Stroke(style, pointerId, pointerType) - this.addPoint(this.currentStroke, point) - } - - appendToCurrentStroke(point: TPointer): void - { - if (this.currentStroke) { - this.addPoint(this.currentStroke, point) - } - } - - endCurrentStroke(point: TPointer): void - { - if (this.currentStroke) { - this.addPoint(this.currentStroke, point) - this.addStroke(this.currentStroke) - this.currentStroke = undefined - } - } - - #getStrokeFromPoint(point: TPoint): TStroke[] - { - const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max) - - const _strokeList: TStroke[] = [] - this.rawStrokes.forEach((stroke) => - { - for (let i = 0; i < stroke.pointers.length; i++) { - const strokePointer = stroke.pointers[i] - if ( - isBetween(strokePointer.x, point.x - 5, point.x + 5) && - isBetween(strokePointer.y, point.y - 5, point.y + 5) - ) { - _strokeList.push(stroke) - break - } - else { - if (computeDistance(point, strokePointer) < 10) { - _strokeList.push(stroke) - break - } - } - } - }) - return _strokeList - } - - resetSelectedStrokes(): void - { - this.selectedStrokes = [] - } - - appendSelectedStrokesFromPoint(point: TPoint): void - { - this.#getStrokeFromPoint(point) - .forEach(s => - { - if (!this.selectedStrokes.includes(s)) { - this.selectedStrokes.push(s) - } - }) - } - - updateStroke(updatedStroke: TStroke): void - { - const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id) - if (strokeIndex !== -1) { - this.rawStrokes.splice(strokeIndex, 1, updatedStroke) - } - } - - removeStroke(id: string): void - { - const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id) - if (strokeIndex !== -1) { - this.rawStrokes.splice(strokeIndex, 1) - } - } - - removeStrokesFromPoint(point: TPoint): string[] - { - const strokes = this.#getStrokeFromPoint(point) - strokes.forEach(strokeToRemove => - { - this.removeStroke(strokeToRemove.id) - }) - return strokes.map(s => s.id) - } - - updatePositionSent(position: number = this.rawStrokes.length): void - { - this.positions.lastSentPosition = position - } - - updatePositionReceived(): void - { - this.positions.lastReceivedPosition = this.positions.lastSentPosition - } - - getClone(): IModel - { - const clonedModel = new Model(this.width, this.height, this.creationTime) - clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate)) - clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined - clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes)) - clonedModel.positions = JSON.parse(JSON.stringify(this.positions)) - clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined - clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined - clonedModel.idle = this.idle - return clonedModel - } - - clear(): void - { - this.modificationDate = Date.now() - this.currentStroke = undefined - this.rawStrokes = [] - this.positions.lastSentPosition = 0 - this.positions.lastReceivedPosition = 0 - this.exports = undefined - this.converts = undefined - this.idle = true - } -} diff --git a/src/model/Stroke.ts b/src/model/Stroke.ts deleted file mode 100644 index d8730dc6..00000000 --- a/src/model/Stroke.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" -import { TStroke, TStrokeJSON } from "../@types/model/Stroke" -import { TPointer } from "../@types/geometry" - -export class Stroke implements TStroke -{ - id: string - type: string - pointerId: number - pointerType: string - elementType?: string - pointers: TPointer[] - length: number - style: TPenStyle - - constructor(style: TPenStyle, pointerId: number, pointerType = "pen") - { - this.id = `${pointerType}-${Date.now().toString()}` - this.type = "stroke" - this.pointerId = pointerId - this.pointerType = pointerType - this.pointers = [] - this.length = 0 - this.style = style - } -} - -export function convertStrokeToJSON(stroke: TStroke): TStrokeJSON -{ - const json: TStrokeJSON = { - id: stroke.id, - pointerType: stroke.pointerType, - p: [], - t: [], - x: [], - y: [] - } - stroke.pointers.forEach(p => { - json.p.push(p.p) - json.t.push(p.t) - json.x.push(p.x) - json.y.push(p.y) - }) - return json -} diff --git a/src/model/index.ts b/src/model/index.ts deleted file mode 100644 index e261eeb5..00000000 --- a/src/model/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Model } from "./Model" -export { Stroke, convertStrokeToJSON } from "./Stroke" diff --git a/src/recognizer/CryptoHelper.ts b/src/recognizer/CryptoHelper.ts deleted file mode 100644 index 2847de7c..00000000 --- a/src/recognizer/CryptoHelper.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Hex from "crypto-js/enc-hex" -import HmacSHA512 from "crypto-js/hmac-sha512" - -export function computeHmac (message: string, applicationKey: string, hmacKey: string): string { - const hmac = new HmacSHA512(message, applicationKey + hmacKey) - return hmac.toString(Hex) as string -} diff --git a/src/recognizer/RestRecognizer.ts b/src/recognizer/RestRecognizer.ts deleted file mode 100644 index 96c73e89..00000000 --- a/src/recognizer/RestRecognizer.ts +++ /dev/null @@ -1,256 +0,0 @@ - -import { IRecognizer } from "../@types/recognizer/Recognizer" -import { TRestPostConfiguration, TRestPostData } from "../@types/recognizer/RestRecognizer" -import { TStrokeGroup, TStrokeGroupJSON } from "../@types/model/Stroke" -import { TConverstionState, TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { IModel, TExport, TJIIXExport } from "../@types/model/Model" -import { TPenStyle } from "../@types/style/PenStyle" - -import { Error as ErrorConst } from "../Constants" -import StyleHelper from "../style/StyleHelper" -import { computeHmac } from "./CryptoHelper" -import { isVersionSuperiorOrEqual } from "../utils/version" -import { convertStrokeToJSON } from "../model/Stroke" - -type ApiError = { - code?: string - message: string -} - -export class RestRecognizer implements IRecognizer -{ - protected serverConfiguration: TServerConfiguration - protected recognitionConfiguration: TRecognitionConfiguration - - constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration) - { - this.serverConfiguration = serverConfig - this.recognitionConfiguration = recognitionConfig - } - - get url() - { - return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch` - } - - get postConfig(): TRestPostConfiguration - { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - return { - lang: this.recognitionConfiguration.lang, - diagram: this.recognitionConfiguration.diagram, - export: this.recognitionConfiguration.export - } - case "MATH": - return { - lang: this.recognitionConfiguration.lang, - math: this.recognitionConfiguration.math, - export: this.recognitionConfiguration.export - } - case "Raw Content": - return { - lang: this.recognitionConfiguration.lang, - "raw-content": this.recognitionConfiguration["raw-content"], - export: this.recognitionConfiguration.export - } - case "TEXT": - return { - lang: this.recognitionConfiguration.lang, - text: this.recognitionConfiguration.text, - export: this.recognitionConfiguration.export - } - default: - throw new Error(`get postConfig error Recognition type unkow "${ this.recognitionConfiguration.type }"`) - break - } - } - - private buildData(model: IModel): TRestPostData - { - const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) => - { - return ps1["-myscript-pen-fill-color"] === ps2["-myscript-pen-fill-color"] && - ps1["-myscript-pen-fill-style"] === ps2["-myscript-pen-fill-style"] && - ps1["-myscript-pen-width"] === ps2["-myscript-pen-width"] && - ps1.color === ps2.color && - ps1.width === ps2.width - } - - const strokeGroupByPenStyle: TStrokeGroup[] = [] - model.rawStrokes.forEach((s) => { - const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style)) - if (groupIndex > -1) { - strokeGroupByPenStyle[groupIndex].strokes.push(s) - } else { - strokeGroupByPenStyle.push({ - penStyle: s.style, - strokes: [s] - }) - } - }) - - const strokeGroupsToSend: TStrokeGroupJSON[] = [] - strokeGroupByPenStyle.forEach((group: TStrokeGroup) => - { - const newPenStyle = JSON.stringify(group.penStyle) === "{}" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle) - const newGroup = { - penStyle: newPenStyle, - strokes: group.strokes.map(convertStrokeToJSON) - } - strokeGroupsToSend.push(newGroup) - }) - - const contentType: string = this.recognitionConfiguration.type === "Raw Content" ? - "Raw Content" : - this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase() - - return { - configuration: this.postConfig, - xDPI: 96, - yDPI: 96, - contentType, - // theme: StyleHelper.themeToCSS(), - height: model.height, - width: model.width, - strokeGroups: strokeGroupsToSend - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private async post(data: any, mimeType: string): Promise - { - const headers = new Headers() - headers.append("Accept", "application/json," + mimeType) - headers.append("applicationKey", this.serverConfiguration.applicationKey) - headers.append("hmac", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)) - headers.append("Content-Type", "application/json") - - if (isVersionSuperiorOrEqual(this.serverConfiguration.version, "2.0.4")) { - headers.append("myscript-client-name", "iink-ts") - headers.append("myscript-client-version", "1.0.0-buildVersion") - } - - const reqInit: RequestInit = { - method: "POST", - headers, - body: JSON.stringify(data) - } - const request = new Request(this.url, reqInit) - const response: Response = await fetch(request) - if (response.ok) { - const contentType = response.headers.get("content-type") - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let result: any - switch (contentType) { - case "application/vnd.openxmlformats-officedocument.presentationml.presentation": - case "image/png": - case "image/jpeg": - result = await response.blob() - break - case "application/json": - result = await response.json() - break - case "application/vnd.myscript.jiix": - result = await response.clone().json().catch(async () => await response.text()) - break - default: - result = await response.text() - break - } - return result - } else { - const err = await response.json() as ApiError - throw err - } - } - - private async tryFetch(data: unknown, mimeType: string): Promise - { - return this.post(data, mimeType) - .then((res) => - { - const exports: TExport = {} - exports[mimeType] = res as TJIIXExport | string | Blob - return exports - }) - .catch((err) => - { - let message = err.message || ErrorConst.UNKNOW - if (!err.code) { - message = ErrorConst.CANT_ESTABLISH - } else if (err.code === "access.not.granted") { - message = ErrorConst.WRONG_CREDENTIALS - } - const error = new Error(message) - throw error - }) - } - - private getMimeTypes(requestedMimeTypes?: string[]): string[] - { - let mimeTypes: string[] = requestedMimeTypes || [] - if (!mimeTypes.length) { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - mimeTypes = this.recognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = this.recognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - case "TEXT": - mimeTypes = this.recognitionConfiguration.text.mimeTypes - break - default: - throw new Error(`Recognition type "${ this.recognitionConfiguration.type }" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`) - break - } - } - return mimeTypes - } - - async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - { - const myModel = model.getClone() - const mimeTypes = this.getMimeTypes(requestedMimeTypes) - const dataToConcert = this.buildData(myModel) - dataToConcert.conversionState = conversionState - const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt)) - const converts: TExport[] = await Promise.all(promises) - converts.forEach(c => - { - myModel.mergeConvert(c) - }) - return myModel - } - - async export(model: IModel, requestedMimeTypes?: string[]): Promise - { - const myModel = model.getClone() - if (myModel.rawStrokes.length === 0) { - return Promise.resolve(myModel) - } - const mimeTypes = this.getMimeTypes(requestedMimeTypes) - if (!mimeTypes.length) { - return Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration")) - } - const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m]) - const data = this.buildData(model) - const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType))) - exports.forEach(e => - { - myModel.mergeExport(e) - }) - return myModel - } - - async resize(model: IModel): Promise - { - return this.export(model) - } - -} diff --git a/src/recognizer/WSRecognizer.ts b/src/recognizer/WSRecognizer.ts deleted file mode 100644 index c8edd459..00000000 --- a/src/recognizer/WSRecognizer.ts +++ /dev/null @@ -1,716 +0,0 @@ - -import { IRecognizer } from "../@types/recognizer/Recognizer" -import { TConverstionState, TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { IModel, TExport, TJIIXExport } from "../@types/model/Model" -import { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TStroke } from "../@types/model/Stroke" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" - -import { Error as ErrorConst } from "../Constants" -import { InternalEvent } from "../event/InternalEvent" -import { computeHmac } from "./CryptoHelper" -import StyleHelper from "../style/StyleHelper" -import { DeferredPromise } from "../utils/DeferredPromise" -import { isVersionSuperiorOrEqual } from "../utils/version" -import { convertStrokeToJSON } from "../model/Stroke" - -/** - * A websocket dialog have this sequence : - * --------------------------- Client --------------------------------------------------- Server ---------------------------------- - * init: send newContentPackage or restoreIInkSession ==================> - * <================== hmacChallenge - * answer hmacChallenge: send the hmac ==================> - * <================== contentPackageDescription - * answer contentPackageDescription: - * send the configuration ==================> - * send newContentPart or openContentPart ==================> - * <================== partChanged - * <================== contentChanged - * <================== newPart - * <================== svgPatch - * - * setPenStyle (send the parameters) ==================> - * setTheme (send the parameters) ==================> - * setPenStyleClasses (send the parameters) ==================> - * <================== svgPatch - * addStrokes (send the strokes ) ============> - * <================== update - */ -export class WSRecognizer implements IRecognizer -{ - protected serverConfiguration: TServerConfiguration - protected recognitionConfiguration: TRecognitionConfiguration - - protected socket!: WebSocket - protected pingCount = 0 - protected reconnectionCount = 0 - protected viewSizeHeight!: number - protected viewSizeWidth!: number - // contentPartCount = 0 - protected sessionId?: string - protected currentPartId?: string - protected currentErrorCode?: string | number - - protected penStyle?: TPenStyle - protected penStyleClasses?: string - protected theme?: TTheme - - protected connected?: DeferredPromise - protected initialized?: DeferredPromise - protected addStrokeDeferred?: DeferredPromise - protected exportDeferred?: DeferredPromise - protected convertDeferred?: DeferredPromise - protected importDeferred?: DeferredPromise - protected resizeDeferred?: DeferredPromise - protected undoDeferred?: DeferredPromise - protected redoDeferred?: DeferredPromise - protected clearDeferred?: DeferredPromise - protected importPointEventsDeferred?: DeferredPromise - protected waitForIdleDeferred?: DeferredPromise - - url: string - - constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration) - { - this.serverConfiguration = serverConfig - this.recognitionConfiguration = recognitionConfig - const scheme = (this.serverConfiguration.scheme === "https") ? "wss" : "ws" - this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }` - } - - get mimeTypes(): string[] - { - switch (this.recognitionConfiguration.type.toLocaleLowerCase()) { - case "text": - return this.recognitionConfiguration.text.mimeTypes - case "math": - return this.recognitionConfiguration.math.mimeTypes - case "diagram": - return this.recognitionConfiguration.diagram.mimeTypes - default: - //"raw-content" - return [] - } - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - protected infinitePing(): void - { - this.pingCount++ - if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) { - this.socket.close(1000, "PING_LOST") - } else if (this.socket.readyState <= 1) { - setTimeout(() => - { - if (this.socket.readyState <= 1) { - this.socket.send(JSON.stringify({ type: "ping" })) - this.infinitePing() - } - }, this.serverConfiguration.websocket.pingDelay) - } - } - - protected openCallback(): void - { - this.connected?.resolve() - const params: TWebSocketEvent = { - type: this.sessionId ? "restoreIInkSession" : "newContentPackage", - iinkSessionId: this.sessionId, - applicationKey: this.serverConfiguration.applicationKey, - xDpi: 96, - yDpi: 96, - viewSizeHeight: this.viewSizeHeight, - viewSizeWidth: this.viewSizeWidth - } - if (isVersionSuperiorOrEqual(this.serverConfiguration.version, "2.0.4")) { - params["myscript-client-name"] = "iink-ts" - params["myscript-client-version"] = "1.0.0-buildVersion" - } - this.send(params) - } - - protected rejectDeferredPending(error: Error): void - { - if (this.connected?.isPending) { - this.connected?.reject(error) - } - if (this.initialized?.isPending) { - this.initialized?.reject(error) - } - if (this.addStrokeDeferred?.isPending) { - this.addStrokeDeferred?.reject(error) - } - if (this.exportDeferred?.isPending) { - this.exportDeferred?.reject(error) - } - if (this.convertDeferred?.isPending) { - this.convertDeferred?.reject(error) - } - if (this.importDeferred?.isPending) { - this.importDeferred?.reject(error) - } - if (this.resizeDeferred?.isPending) { - this.resizeDeferred?.reject(error) - } - if (this.undoDeferred?.isPending) { - this.undoDeferred?.reject(error) - } - if (this.redoDeferred?.isPending) { - this.redoDeferred?.reject(error) - } - if (this.clearDeferred?.isPending) { - this.clearDeferred.reject(error) - } - if (this.waitForIdleDeferred?.isPending) { - this.waitForIdleDeferred.reject(error) - } - } - - protected closeCallback(evt: CloseEvent): void - { - let message = "" - if (!this.currentErrorCode) { - switch (evt.code) { - case 1000: - // Normal Closure - break - case 1001: - message = ErrorConst.GOING_AWAY - break - case 1002: - message = ErrorConst.PROTOCOL_ERROR - break - case 1003: - message = ErrorConst.UNSUPPORTED_DATA - break - case 1006: - message = ErrorConst.ABNORMAL_CLOSURE - break - case 1007: - message = ErrorConst.INVALID_FRAME_PAULOAD - break - case 1008: - message = ErrorConst.POLICY_VIOLATION - break - case 1009: - message = ErrorConst.MESSAGE_TOO_BIG - break - case 1011: - message = ErrorConst.INTERNAL_ERROR - break - case 1012: - message = ErrorConst.SERVICE_RESTART - break - case 1013: - message = ErrorConst.TRY_AGAIN - break - case 1014: - message = ErrorConst.BAD_GATEWAY - break - case 1015: - message = ErrorConst.TLS_HANDSHAKE - break - default: - message = ErrorConst.CANT_ESTABLISH - break - } - } - const error = new Error(message || evt.reason) - - this.rejectDeferredPending(error) - - if (!this.currentErrorCode && evt.code !== 1000) { - this.internalEvent.emitError(error) - } - } - - protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void - { - const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent - if (hmacChallengeMessage.hmacChallenge) { - this.send({ - type: "hmac", - hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey) - }) - } - if (hmacChallengeMessage.iinkSessionId) { - this.sessionId = hmacChallengeMessage.iinkSessionId - } - } - - protected manageContentPackageDescriptionMessage(): void - { - this.reconnectionCount = 0 - - this.send({ ...this.recognitionConfiguration, type: "configuration" }) - - if (this.currentPartId) { - this.send({ type: "openContentPart", id: this.currentPartId, mimeTypes: this.mimeTypes }) - } - else { - this.send({ type: "newContentPart", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes }) - } - } - - protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void - { - const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent - this.currentPartId = partChangeMessage.partId - this.initialized?.resolve() - } - - protected manageExportMessage(websocketMessage: TWebSocketEvent): void - { - const exportMessage = websocketMessage as TWebSocketExportEvent - if (exportMessage.exports["application/vnd.myscript.jiix"]) { - exportMessage.exports["application/vnd.myscript.jiix"] = JSON.parse(exportMessage.exports["application/vnd.myscript.jiix"].toString()) as TJIIXExport - } - this.initialized?.resolve() - this.addStrokeDeferred?.resolve(exportMessage.exports) - this.exportDeferred?.resolve(exportMessage.exports) - this.convertDeferred?.resolve(exportMessage.exports) - this.importDeferred?.resolve(exportMessage.exports) - this.undoDeferred?.resolve(exportMessage.exports) - this.redoDeferred?.resolve(exportMessage.exports) - this.clearDeferred?.resolve(exportMessage.exports) - this.importPointEventsDeferred?.resolve(exportMessage.exports) - this.internalEvent.emitExported(exportMessage.exports) - } - - protected async manageWaitForIdle(): Promise { - this.internalEvent.emitIdle(true) - this.waitForIdleDeferred?.resolve() - } - - protected manageErrorMessage(websocketMessage: TWebSocketEvent): void - { - const err = websocketMessage as TWebSocketErrorEvent - this.currentErrorCode = err.data?.code || err.code - let message = err.data?.message || err.message || ErrorConst.UNKNOW - - switch (this.currentErrorCode) { - case "no.activity": - message = ErrorConst.NO_ACTIVITY - break - case "access.not.granted": - message = ErrorConst.WRONG_CREDENTIALS - break - case "session.too.old": - message = ErrorConst.TOO_OLD - break - } - const error = new Error(message) - this.rejectDeferredPending(error) - this.internalEvent.emitError(error) - } - - protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void - { - const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent - const context: TUndoRedoContext = { - canRedo: contentChangeMessage.canRedo, - canUndo: contentChangeMessage.canUndo, - empty: contentChangeMessage.empty, - stackIndex: contentChangeMessage.undoStackIndex, - possibleUndoCount: contentChangeMessage.possibleUndoCount, - stack: [] - } - this.internalEvent.emitContextChange(context) - } - - protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void - { - this.resizeDeferred?.resolve() - const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent - this.internalEvent.emitSVGPatch(svgPatchMessage) - } - - protected messageCallback(message: MessageEvent): void - { - this.currentErrorCode = undefined - const websocketMessage: TWebSocketEvent = JSON.parse(message.data) - if (websocketMessage.type !== "pong") { - this.pingCount = 0 - switch (websocketMessage.type) { - case "ack": - this.manageHMACChallengeMessage(websocketMessage) - break - case "contentPackageDescription": - this.manageContentPackageDescriptionMessage() - break - case "partChanged": - this.managePartChangeMessage(websocketMessage) - break - case "newPart": - this.initialized?.resolve() - break - case "contentChanged": - this.manageContentChangeMessage(websocketMessage) - break - case "exported": - this.manageExportMessage(websocketMessage) - break - case "svgPatch": - this.manageSVGPatchMessage(websocketMessage) - break - case "error": - this.manageErrorMessage(websocketMessage) - break - case "idle": - this.manageWaitForIdle() - break - // case "supportedImportMimeTypes": - // recognizerContext.supportedImportMimeTypes = message.data.mimeTypes - // recognitionContext.response(undefined, message.data) - // break - // case "fileChunkAck": - // this.importDeferred?.resolve((websocketMessage as unknown) as TExport) - // break - // case "idle": - // recognizerContext.idle = true - // recognitionContext.patch(undefined, message.data) - // break - // default : - // logger.warn("This is something unexpected in current recognizer. Not the type of message we should have here.", message) - } - } - } - - async init(height: number, width: number): Promise - { - try { - this.destroy() - this.connected = new DeferredPromise() - this.initialized = new DeferredPromise() - this.viewSizeHeight = height - this.viewSizeWidth = width - this.pingCount = 0 - this.socket = new WebSocket(this.url) - - if (this.serverConfiguration.websocket.pingEnabled) { - this.infinitePing() - } - - this.socket.addEventListener("open", this.openCallback.bind(this)) - this.socket.addEventListener("close", this.closeCallback.bind(this)) - this.socket.addEventListener("message", this.messageCallback.bind(this)) - - return this.initialized.promise - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (err: any) { - const error = new Error(ErrorConst.CANT_ESTABLISH) - this.internalEvent.emitError(error) - this.initialized?.reject(error) - return this.initialized?.promise - } - } - - async send(message: TWebSocketEvent): Promise - { - if (!this.connected) { - return Promise.reject(new Error("Recognizer must be initilized")) - } - await this.connected.promise - if (this.socket.readyState === this.socket.OPEN) { - this.socket.send(JSON.stringify(message)) - return Promise.resolve() - } else { - if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) { - this.reconnectionCount++ - if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) { - this.internalEvent.emitClearMessage() - await this.init(this.viewSizeHeight, this.viewSizeWidth) - this.setPenStyle(this.penStyle as TPenStyle) - this.setPenStyleClasses(this.penStyleClasses as string) - this.setTheme(this.theme as TTheme) - return this.send(message) - } - else { - return Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached.")) - } - } - } - } - - async addStrokes(model: IModel): Promise - { - await this.initialized?.promise - this.addStrokeDeferred = new DeferredPromise() - const strokes: TStroke[] = model.extractUnsentStrokes() - model.updatePositionSent() - const localModel = model.getClone() - if (strokes.length === 0) { - this.addStrokeDeferred.resolve({} as TExport) - return localModel - } - await this.send({ - type: "addStrokes", - strokes: strokes.map(convertStrokeToJSON) - }) - const exports = await this.addStrokeDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(exports) - return localModel - } - - async setPenStyle(penStyle: TPenStyle): Promise - { - await this.initialized?.promise - this.penStyle = penStyle - const message: TWebSocketEvent = { - type: "setPenStyle", - style: StyleHelper.penStyleToCSS(penStyle) - } - return this.send(message) - } - - async setPenStyleClasses(penStyleClasses: string): Promise - { - await this.initialized?.promise - this.penStyleClasses = penStyleClasses - const message: TWebSocketEvent = { - type: "setPenStyleClasses", - styleClasses: penStyleClasses - } - return this.send(message) - } - - async setTheme(theme: TTheme): Promise - { - await this.initialized?.promise - this.theme = theme - const message: TWebSocketEvent = { - type: "setTheme", - theme: StyleHelper.themeToCSS(theme) - } - return this.send(message) - } - - async export(model: IModel, requestedMimeTypes?: string[]): Promise - { - await this.initialized?.promise - this.exportDeferred = new DeferredPromise() - const localModel = model.getClone() - let mimeTypes: string[] = requestedMimeTypes || [] - if (!mimeTypes.length) { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - mimeTypes = this.recognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = this.recognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - case "TEXT": - mimeTypes = this.recognitionConfiguration.text.mimeTypes - break - default: - throw new Error(`Recognition type "${ this.recognitionConfiguration.type }" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`) - } - } - - if (!mimeTypes.length) { - return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`)) - } - - const message: TWebSocketEvent = { - type: "export", - partId: this.currentPartId, - mimeTypes - } - await this.send(message) - const exports: TExport = await this.exportDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(exports) - return localModel - } - - async import(model: IModel, data: Blob, mimeType?: string): Promise - { - await this.initialized?.promise - const localModel = model.getClone() - const chunkSize = this.serverConfiguration.websocket.fileChunkSize - const importFileId = Math.random().toString(10).substring(2, 6) - this.importDeferred = new DeferredPromise() - const readBlob = (blob: Blob): Promise => - { - const fileReader = new FileReader() - return new Promise((resolve, reject) => - { - fileReader.onloadend = (ev) => resolve(ev.target?.result as string) - fileReader.onerror = () => reject() - fileReader.readAsText(blob) - }) - } - - const importFileMessage: TWebSocketEvent = { - type: "importFile", - importFileId, - mimeType - } - await this.send(importFileMessage) - for (let i = 0; i < data.size; i += chunkSize) { - const blobPart = data.slice(i, i + chunkSize, data.type) - const partFileString = await readBlob(blobPart) - const fileChuckMessage: TWebSocketEvent = { - type: "fileChunk", - importFileId, - data: partFileString, - lastChunk: i + chunkSize > data.size - } - await this.send(fileChuckMessage) - } - const exports = await this.importDeferred?.promise - this.importDeferred = undefined - localModel.mergeExport(exports) - return localModel - } - - async resize(model: IModel): Promise - { - await this.initialized?.promise - this.resizeDeferred = new DeferredPromise() - const localModel = model.getClone() - this.viewSizeHeight = localModel.height - this.viewSizeWidth = localModel.width - const message: TWebSocketEvent = { - type: "changeViewSize", - height: this.viewSizeHeight, - width: this.viewSizeWidth, - } - await this.send(message) - await this.resizeDeferred?.promise - return localModel - } - - async importPointEvents(strokes: TStroke[]): Promise - { - await this.initialized?.promise - this.importPointEventsDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "pointerEvents", - events: strokes.map(convertStrokeToJSON) - } - this.send(message) - - const exportPoints = await this.importPointEventsDeferred?.promise - this.importPointEventsDeferred = undefined - return exportPoints as TExport - } - - async convert(model: IModel, conversionState?: TConverstionState): Promise - { - await this.initialized?.promise - this.convertDeferred = new DeferredPromise() - const localModel = model.getClone() - const message: TWebSocketEvent = { - type: "convert", - conversionState - } - await this.send(message) - const myExportConverted: TExport = await this.convertDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeConvert(myExportConverted) - localModel.mergeExport(myExportConverted) - return localModel - } - - async waitForIdle(): Promise - { - await this.initialized?.promise - this.waitForIdleDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "waitForIdle", - } - await this.send(message) - return this.waitForIdleDeferred?.promise - } - - async undo(model: IModel): Promise - { - await this.initialized?.promise - const localModel = model.getClone() - this.undoDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "undo", - } - await this.send(message) - const undoExports = await this.undoDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(undoExports) - this.undoDeferred = undefined - return localModel - } - - async redo(model: IModel): Promise - { - await this.initialized?.promise - const localModel = model.getClone() - this.redoDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "redo", - } - await this.send(message) - const redoExports = await this.redoDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(redoExports) - this.redoDeferred = undefined - return localModel - } - - async clear(model: IModel): Promise - { - await this.initialized?.promise - const localModel = model.getClone() - localModel.modificationDate = Date.now() - this.clearDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "clear", - } - await this.send(message) - const clearExports = await this.clearDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(clearExports) - this.clearDeferred = undefined - return localModel - } - - close(code: number, reason: string): void - { - if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) { - this.socket.removeEventListener("close", this.closeCallback) - this.socket.removeEventListener("message", this.messageCallback) - this.socket.removeEventListener("open", this.openCallback) - this.socket.close(code, reason) - } - } - - destroy(): void - { - this.connected = undefined - this.initialized = undefined - this.addStrokeDeferred = undefined - this.exportDeferred = undefined - this.convertDeferred = undefined - this.importDeferred = undefined - this.resizeDeferred = undefined - this.undoDeferred = undefined - this.redoDeferred = undefined - this.clearDeferred = undefined - if (this.socket) { - this.socket.removeEventListener("close", this.closeCallback) - this.socket.removeEventListener("message", this.messageCallback) - this.socket.removeEventListener("open", this.openCallback) - this.close(1000, "Recognizer destroyed") - } - } -} diff --git a/src/recognizer/index.ts b/src/recognizer/index.ts deleted file mode 100644 index dfc7fb91..00000000 --- a/src/recognizer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { computeHmac } from "./CryptoHelper" -export { RestRecognizer } from "./RestRecognizer" -export { WSRecognizer } from "./WSRecognizer" diff --git a/src/renderer/QuadraticUtils.ts b/src/renderer/QuadraticUtils.ts deleted file mode 100644 index 5b84db32..00000000 --- a/src/renderer/QuadraticUtils.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TPoint, TPointer } from "../@types/geometry" - -export function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[] -{ - const radius = point.p * width - return [ - { - x: (point.x - (Math.sin(angle) * radius)), - y: (point.y + (Math.cos(angle) * radius)) - }, - { - x: (point.x + (Math.sin(angle) * radius)), - y: (point.y - (Math.cos(angle) * radius)) - } - ] -} - -export function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer -{ - return { - x: ((point2.x + point1.x) / 2), - y: ((point2.y + point1.y) / 2), - p: ((point2.p + point1.p) / 2), - t: ((point2.t + point1.t) / 2) - } -} - -export function computeAxeAngle(begin: TPointer, end: TPointer): number -{ - return Math.atan2(end.y - begin.y, end.x - begin.x) -} diff --git a/src/renderer/canvas/CanvasRenderer.ts b/src/renderer/canvas/CanvasRenderer.ts deleted file mode 100644 index 6d382c41..00000000 --- a/src/renderer/canvas/CanvasRenderer.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { TStroke } from "../../@types/model/Stroke" -import { TRenderingConfiguration } from "../../@types/configuration/RenderingConfiguration" -import { IModel } from "../../@types/model/Model" -import { TSymbol } from "../../@types/renderer/Symbol" - -import { drawShapeSymbol, ShapeSymbols } from "./CanvasRendererShapeSymbol" -import { drawStroke } from "./CanvasRendererStrokeSymbol" -import { drawTextSymbol, TextSymbols } from "./CanvasRendererTextSymbol" -import { CanvasStroker } from "./CanvasStroker" - -export class CanvasRenderer -{ - config: TRenderingConfiguration - stroker: CanvasStroker - context!: { - parent: HTMLElement - renderingCanvas: HTMLCanvasElement - renderingCanvasContext: CanvasRenderingContext2D - capturingCanvas: HTMLCanvasElement - capturingCanvasContext: CanvasRenderingContext2D - } - - constructor(config: TRenderingConfiguration) - { - this.config = config - this.stroker = new CanvasStroker() - } - - private createCanvas(type: string): HTMLCanvasElement - { - const canvas: HTMLCanvasElement = document.createElement("canvas") - canvas.id = type - canvas.classList.add(type) - canvas.classList.add("ms-canvas") - return canvas - } - - private resizeContent(): void - { - const pixelRatio: number = window.devicePixelRatio - const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas] - elements.forEach((canvas) => - { - const domElement = canvas.parentNode as HTMLElement - const width = Math.max(this.config.minWidth, domElement.clientWidth) - const height = Math.max(this.config.minHeight, domElement.clientHeight) - canvas.width = width * pixelRatio - canvas.height = height * pixelRatio - canvas.getContext("2d")?.scale(pixelRatio, pixelRatio) - canvas.style.width = `${ width }px` - canvas.style.height = `${ height }px` - }) - } - - private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) - { - const type = symbol.elementType || symbol.type - if (type === "stroke") { - drawStroke(context2D, symbol as TStroke, this.stroker) - } else if (Object.keys(TextSymbols).includes(type)) { - drawTextSymbol(context2D, symbol) - } else if (Object.keys(ShapeSymbols).includes(type)) { - drawShapeSymbol(context2D, symbol) - } - } - - init(element: HTMLElement): void - { - const renderingCanvas: HTMLCanvasElement = this.createCanvas("ms-rendering-canvas") - element.appendChild(renderingCanvas) - - const capturingCanvas: HTMLCanvasElement = this.createCanvas("ms-capture-canvas") - element.appendChild(capturingCanvas) - - this.context = { - parent: element, - renderingCanvas, - renderingCanvasContext: renderingCanvas.getContext("2d") as CanvasRenderingContext2D, - capturingCanvas, - capturingCanvasContext: capturingCanvas.getContext("2d") as CanvasRenderingContext2D - } - - this.resizeContent() - } - - drawModel(model: IModel): void - { - this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height) - model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol)) - this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height) - } - - drawPendingStroke(stroke: TStroke | undefined): void - { - this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height) - if (stroke && stroke?.pointerType !== "eraser") { - this.stroker.drawStroke(this.context.capturingCanvasContext, stroke) - } - } - - resize(model: IModel): void - { - this.resizeContent() - this.drawModel(model) - } - - destroy(): void - { - if (this.context.parent) { - this.context.parent.innerHTML = "" - } - } -} diff --git a/src/renderer/canvas/CanvasRendererShapeSymbol.ts b/src/renderer/canvas/CanvasRendererShapeSymbol.ts deleted file mode 100644 index d5ec42c1..00000000 --- a/src/renderer/canvas/CanvasRendererShapeSymbol.ts +++ /dev/null @@ -1,190 +0,0 @@ - -import { TPoint } from "../../@types/geometry" -import { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from "../../@types/renderer/Symbol" - -export const ShapeSymbols = { - table: "table", - shape: "shape", - recognizedShape: "recognizedShape", - ellipse: "ellipse", - line: "line" -} - -function phi(angle: number): number -{ - let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI - if (returnedAngle < -Math.PI) { - returnedAngle += Math.PI * 2 - } - return returnedAngle -} - -function drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[] -{ - const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse - const angleStep = 0.02 // angle delta between interpolated - - let z1 = Math.cos(orientation) - let z3 = Math.sin(orientation) - let z2 = z1 - let z4 = z3 - z1 *= maxRadius - z2 *= minRadius - z3 *= maxRadius - z4 *= minRadius - - const n = Math.floor(Math.abs(sweepAngle) / angleStep) - - const boundariesPoints = [] - - context2D.save() - try { - context2D.beginPath() - - for (let i = 0; i <= n; i++) { - const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian - const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius) - - const cosAlpha = Math.cos(alpha) - const sinAlpha = Math.sin(alpha) - - // current point - const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha) - const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha) - if (i === 0) { - context2D.moveTo(x, y) - } else { - context2D.lineTo(x, y) - } - - if (i === 0 || i === n) { - boundariesPoints.push({ x, y }) - } - } - - context2D.stroke() - } finally { - context2D.restore() - } - - return boundariesPoints -} - -function drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number) -{ - const alpha = phi(angle + (Math.PI * (7 / 8))) - const beta = phi(angle - (Math.PI * (7 / 8))) - context2D.save() - try { - context2D.fillStyle = context2D.strokeStyle - - context2D.moveTo(headPoint.x, headPoint.y) - context2D.beginPath() - context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha))) - context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta))) - context2D.lineTo(headPoint.x, headPoint.y) - context2D.fill() - } finally { - context2D.restore() - } -} - -function drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol) -{ - const points = drawEllipseArc(context2D, shapeEllipse) - - if (shapeEllipse?.beginDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0) - } - if (shapeEllipse?.endDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0) - } -} - -/** - * Draw a line - * @param {Object} context2D Current rendering context2D - * @param {{x: Number, y: Number}} p1 Origin point - * @param {{x: Number, y: Number}} p2 Destination point - */ -export function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint) -{ - context2D.save() - try { - context2D.beginPath() - context2D.moveTo(p1.x, p1.y) - context2D.lineTo(p2.x, p2.y) - context2D.stroke() - } finally { - context2D.restore() - } -} - -function drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol) -{ - drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint) - if (shapeLine.beginDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0) - } - if (shapeLine.endDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0) - } -} - -/** - * Draw a shape symbol - * @param {Object} context2D Current rendering context2D - * @param {Object} symbol Symbol to draw - */ -export function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) -{ - context2D.save() - try { - context2D.lineWidth = symbol.style.width as number - context2D.strokeStyle = symbol.style.color as string - - if (symbol.elementType) { - switch (symbol.elementType) { - case ShapeSymbols.shape: { - const shapeSymbol = symbol as TShapeSymbol - drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex]) - break - } - case ShapeSymbols.table:{ - const tableSymbols = symbol as TShapeTableSymbol - tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line)) - break - } - case ShapeSymbols.line: { - const lineSymbol = symbol as TLineSymbol - drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2) - break - } - default: - // logger.error(`${ symbol.elementType } not implemented`) - break - } - } else { - switch (symbol.type) { - case ShapeSymbols.ellipse: { - drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol) - break - } - case ShapeSymbols.line: { - drawShapeLine(context2D, symbol as TShapeLineSymbol) - break - } - case ShapeSymbols.recognizedShape: { - const recognizedShape = symbol as TShapeRecognizedSymbol - recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive)) - break - } - default: - // logger.error(`${ symbol.type } not implemented`) - break - } - } - } finally { - context2D.restore() - } -} diff --git a/src/renderer/canvas/CanvasRendererStrokeSymbol.ts b/src/renderer/canvas/CanvasRendererStrokeSymbol.ts deleted file mode 100644 index ba169b71..00000000 --- a/src/renderer/canvas/CanvasRendererStrokeSymbol.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TStroke } from "../../@types/model/Stroke" -import { CanvasStroker } from "./CanvasStroker" - -export function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) { - if (stroker && stroke && stroke.pointerType !== "eraser") { - stroker.drawStroke(context2D, stroke) - } -} diff --git a/src/renderer/canvas/CanvasRendererTextSymbol.ts b/src/renderer/canvas/CanvasRendererTextSymbol.ts deleted file mode 100644 index d3f420bb..00000000 --- a/src/renderer/canvas/CanvasRendererTextSymbol.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TPoint } from "../../@types/geometry" -import { drawLine } from "./CanvasRendererShapeSymbol" -import { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from "../../@types/renderer/Symbol" - -export const TextSymbols = { - inputCharacter: "inputCharacter", - char: "char", - string: "string", - textLine: "textLine" -} - -function drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol) -{ - const delta = data.width / label.length - const p1: TPoint = { - x: data.topLeftPoint.x + (underline.data.firstCharacter * delta), - y: data.topLeftPoint.y + data.height - } - const p2: TPoint = { - x: data.topLeftPoint.x + (underline.data.lastCharacter * delta), - y: data.topLeftPoint.y + data.height - } - drawLine(context2D, p1, p2) -} - -function drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol) -{ - context2D.save() - try { - context2D.font = `${ data.textHeight }px serif` - context2D.textAlign = (data.justificationType === "CENTER") ? "center" : "left" - context2D.textBaseline = "bottom" - context2D.fillStyle = context2D.strokeStyle - context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height)) - } finally { - context2D.restore() - } -} - -function drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol) -{ - drawText(context2D, textLine.label, textLine.data) - textLine.underlineList.forEach((underline) => - { - drawUnderline(context2D, underline, textLine.label, textLine.data) - }) -} - -/** - * Draw a text symbol - * @param {Object} context Current rendering context - * @param {Object} symbol Symbol to draw - */ -export function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) -{ - context2D.save() - try { - context2D.lineWidth = (symbol.style.width as number) - context2D.strokeStyle = (symbol.style.color as string) - const type: string = symbol.elementType || symbol.type - - switch (type) { - case TextSymbols.textLine: - drawTextLine(context2D, symbol as TTextUnderlineSymbol) - break - default: - console.info(`drawTextSymbol => ${symbol.elementType} not implemented`) - break - } - - } finally { - context2D.restore() - } -} diff --git a/src/renderer/canvas/CanvasStroker.ts b/src/renderer/canvas/CanvasStroker.ts deleted file mode 100644 index 18feb259..00000000 --- a/src/renderer/canvas/CanvasStroker.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { TPointer } from "../../@types/geometry" -import { TStroke } from "../../@types/model/Stroke" -import { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from "../QuadraticUtils" - -export class CanvasStroker -{ - - private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void - { - context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true) - } - - private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width) - - context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y) - context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y) - context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y) - context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y) - } - - private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void - { - const ARCSPLIT = 6 - const angle = computeAxeAngle(begin, end) - const linkPoints = computeLinksPoints(end, angle, width) - context2d.moveTo(linkPoints[0].x, linkPoints[0].y) - for (let i = 1; i <= ARCSPLIT; i++) { - const newAngle = angle - ((i * Math.PI) / ARCSPLIT) - context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle))) - } - } - - private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width) - const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width) - - context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y) - context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y) - context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y) - context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y) - } - - drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void - { - const NUMBER_POINTS = stroke.pointers.length - const NUMBER_QUADRATICS = NUMBER_POINTS - 2 - const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth - const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle - const firstPoint = stroke.pointers[0] as TPointer - - context2d.save() - try { - context2d.beginPath() - if (NUMBER_POINTS < 3) { - this.renderArc(context2d, firstPoint, width * 0.6) - } else { - this.renderArc(context2d, firstPoint, width * firstPoint.p) - const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1]) - this.renderLine(context2d, firstPoint, secondPoint, width) - - // Possibility to try this (the start looks better when the ink is large) - // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]); - // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true); - - for (let i = 0; i < NUMBER_QUADRATICS; i++) { - const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1]) - const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2]) - const ctrl: TPointer = stroke.pointers[i + 1] - this.renderQuadratic(context2d, begin, end, ctrl, width) - } - const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1]) - const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1] - this.renderLine(context2d, beginLine, endLine, width) - - const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2] - const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1] - this.renderFinal(context2d, beginFinal, endFinal, width) - } - context2d.closePath() - if (color !== undefined) { - context2d.fillStyle = color - context2d.fill() - } - context2d.save() - } - finally { - context2d.restore() - } - } -} diff --git a/src/renderer/canvas/index.ts b/src/renderer/canvas/index.ts deleted file mode 100644 index 3f83e86a..00000000 --- a/src/renderer/canvas/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { CanvasRenderer } from "./CanvasRenderer" -export * as canvasRendererShape from "./CanvasRendererShapeSymbol" -export * as canvasRendererStroke from "./CanvasRendererStrokeSymbol" -export * as canvasRendererText from "./CanvasRendererTextSymbol" -export { CanvasStroker } from "./CanvasStroker" diff --git a/src/renderer/index.ts b/src/renderer/index.ts deleted file mode 100644 index 06ec1feb..00000000 --- a/src/renderer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./canvas" -export * from "./svg" -export * as quadradicsUtils from "./QuadraticUtils" diff --git a/src/renderer/svg/SVGStroker.ts b/src/renderer/svg/SVGStroker.ts deleted file mode 100644 index fa1f56c0..00000000 --- a/src/renderer/svg/SVGStroker.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { TPointer } from "../../@types/geometry" -import { TStroke } from "../../@types/model/Stroke" -import { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from "../QuadraticUtils" - -export class SVGStroker -{ - - private getArcPath(center: TPointer, radius: number): string - { - const svgPath = [ - `M ${ center.x },${ center.y }`, - `m ${ -radius },0`, - `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`, - `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0` - ].join(" ") - return svgPath - } - - private getLinePath(begin: TPointer, end: TPointer, width: number): string - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width) - const svgPath = [ - `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`, - `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`, - `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`, - `L ${ linkPoints1[1].x },${ linkPoints1[1].y }` - ].join(" ") - return svgPath - } - - private getFinalPath(begin: TPointer, end: TPointer, width: number): string - { - const ARCSPLIT = 6 - const angle = computeAxeAngle(begin, end) - const linkPoints = computeLinksPoints(end, angle, width) - const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`] - for (let i = 1; i <= ARCSPLIT; i++) { - const newAngle = angle - (i * (Math.PI / ARCSPLIT)) - parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`) - } - const svgPath = parts.join(" ") - return svgPath - } - - private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width) - const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width) - const svgPath = [ - `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`, - `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`, - `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`, - `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }` - ].join(" ") - return svgPath - } - - private buildSVGPath(stroke: TStroke): string - { - const STROKE_LENGTH = stroke.pointers.length - const STROKE_WIDTH = (stroke.style.width as number) - const NB_QUADRATICS = STROKE_LENGTH - 2 - const firstPoint = stroke.pointers[0] - - const parts = [] - if (STROKE_LENGTH < 3) { - parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6)) - } else { - parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p)) - parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH)) - - for (let i = 0; i < NB_QUADRATICS; i++) { - const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1]) - const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2]) - const central = stroke.pointers[i + 1] - parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH) - ) - } - const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2] - const lastPoint = stroke.pointers[STROKE_LENGTH - 1] - parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH)) - parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH)) - } - return parts.join(" ") - } - - drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void - { - const svgPathElement = document.createElementNS("http://www.w3.org/2000/svg", "path") - svgPathElement.classList.add("pending-stroke") - svgPathElement.setAttribute("id", stroke.id) - svgPathElement.setAttribute("type", "stroke") - attrs?.forEach(a => - { - svgPathElement.setAttribute(a.name, a.value) - }) - const svgPath = this.buildSVGPath(stroke) - svgPathElement.setAttribute("d", `${ svgPath }Z`) - svgElement.appendChild(svgPathElement) - } -} diff --git a/src/renderer/svg/WSSVGRenderer.ts b/src/renderer/svg/WSSVGRenderer.ts deleted file mode 100644 index 7ac33f84..00000000 --- a/src/renderer/svg/WSSVGRenderer.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { TRenderingConfiguration } from "../../@types/configuration/RenderingConfiguration" -import { IModel } from "../../@types/model/Model" -import { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from "../../@types/recognizer/WSRecognizer" -import { TStroke } from "../../@types/model/Stroke" -import { SVGStroker } from "./SVGStroker" - -export class WSSVGRenderer -{ - config: TRenderingConfiguration - stroker: SVGStroker - context!: { - parent: HTMLElement - } - - constructor(config: TRenderingConfiguration) - { - this.config = config - this.stroker = new SVGStroker() - } - - init(element: HTMLElement): void - { - element.style.fontSize = "10px" - this.context = { - parent: element - } - } - - #drawStroke(svgElement: SVGElement, stroke: TStroke) - { - let style: string - if (stroke.pointerType === "eraser") { - stroke.style.width = 20 - style = "fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;" - } else { - style = `fill:${ stroke.style.color };stroke:transparent;` - } - this.stroker.drawStroke(svgElement, stroke, [{ name: "style", value: style }]) - } - - #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void - { - const oldLayer = this.context.parent.querySelector(`svg[data-layer="${ layerName }"]`) as SVGElement | null - oldLayer?.remove() - this.context.parent.insertAdjacentHTML("beforeend", update.svg) - const layer = this.context.parent.querySelector(`svg[data-layer="${ layerName }"]`) as SVGElement - if (layerName === "MODEL") { - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", "g") - pendingStrokesGroup.id = "pendingStrokes" - layer.appendChild(pendingStrokesGroup) - } - } - - #replaceElement(update: TUpdatePatchReplaceELement): void - { - const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null - if (elementToRemove) { - const parent = elementToRemove.parentNode as HTMLElement | null | undefined - elementToRemove?.remove() - parent?.insertAdjacentHTML("beforeend", update.svg) - } - } - - #appendChild(layerName: string, update: TUpdatePatchAppendChild): void - { - const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer="${ layerName }"]` - const parent = this.context.parent.querySelector(parentSelector) as HTMLElement - parent?.insertAdjacentHTML("beforeend", update.svg) - } - - #removeChild(update: TUpdatePatchRemoveChild): void - { - this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove() - } - - #removeElement(update: TUpdatePatchRemoveElement): void - { - const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) - if (elementToRemove) { - if (update.id.includes("s") || update.id.includes("MODEL")) { - elementToRemove.remove() - } else { - elementToRemove.setAttribute("class", "removed-stroke") - setTimeout(() => - { - elementToRemove?.remove() - }, 100) - } - } - } - - #insertBefore(update: TUpdatePatchInsertBefore): void - { - const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null - parent?.insertAdjacentHTML("beforebegin", update.svg) - } - - #setAttribute(update: TUpdatePatchSetAttribut): void - { - const selector = update.id ? `#${ update.id }` : "svg" - const element = this.context.parent.querySelector(selector) as HTMLElement | null - element?.setAttribute(update.name, update.value) - } - - #removeAttribute(update: TUpdatePatchRemoveAttribut): void - { - const selector = update.id ? `#${ update.id }` : "svg" - const element = this.context.parent.querySelector(selector) as HTMLElement | null - element?.removeAttribute(update.name) - } - - updateLayer(layerName: string, update: TUpdatePatch): void - { - switch (update.type) { - case "REPLACE_ALL": - this.#replaceAll(layerName, update as TUpdatePatchReplaceAll) - break - case "REPLACE_ELEMENT": - this.#replaceElement(update as TUpdatePatchReplaceELement) - break - case "APPEND_CHILD": - this.#appendChild(layerName, update as TUpdatePatchAppendChild) - break - case "REMOVE_ELEMENT": - this.#removeElement(update as TUpdatePatchRemoveElement) - break - case "REMOVE_CHILD": - this.#removeChild(update as TUpdatePatchRemoveChild) - break - case "INSERT_BEFORE": - this.#insertBefore(update as TUpdatePatchInsertBefore) - break - case "SET_ATTRIBUTE": - this.#setAttribute(update as TUpdatePatchSetAttribut) - break - case "REMOVE_ATTRIBUTE": - this.#removeAttribute(update as TUpdatePatchRemoveAttribut) - break - default: - break - } - } - - updatesLayer(layerName: string, updates: TUpdatePatch[]): void - { - updates.forEach(u => this.updateLayer(layerName, u)) - this.clearPendingStroke() - } - - clearPendingStroke(): void - { - const pendingStrokeGroup = this.context.parent.querySelector("#pendingStrokes") as SVGElement - if (pendingStrokeGroup) { - pendingStrokeGroup.innerHTML = "" - } - } - - drawPendingStroke(stroke: TStroke): void - { - if (stroke) { - const pendingStrokeGroup = this.context.parent.querySelector("#pendingStrokes") as SVGElement - if (pendingStrokeGroup) { - const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`) - if (oldStroke) { - oldStroke.remove() - } - this.#drawStroke(pendingStrokeGroup, stroke) - } - } - } - - resize(model: IModel): void - { - const rect = this.context.parent.getBoundingClientRect() - const svgList = this.context.parent.querySelectorAll("svg") - const width = Math.max(rect.width, model.width) - const height = Math.max(rect.height, model.height) - svgList.forEach(svg => - { - svg.setAttribute("viewBox", `0 0 ${ width }, ${ height }`) - svg.setAttribute("width", `${ width }px`) - svg.setAttribute("height", `${ height }px`) - }) - } - - destroy(): void - { - if (this.context.parent) { - this.context.parent.querySelectorAll("svg").forEach(n => n.remove()) - } - } -} diff --git a/src/renderer/svg/index.ts b/src/renderer/svg/index.ts deleted file mode 100644 index cb44a560..00000000 --- a/src/renderer/svg/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SVGStroker } from "./SVGStroker" -export { WSSVGRenderer} from "./WSSVGRenderer" diff --git a/src/smartguide/SmartGuide.ts b/src/smartguide/SmartGuide.ts deleted file mode 100644 index a2a008d1..00000000 --- a/src/smartguide/SmartGuide.ts +++ /dev/null @@ -1,410 +0,0 @@ -import { TMarginConfiguration } from "../@types/configuration/recognition/MarginConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TJIIXExport, TWordExport } from "../@types/model/Model" -import { InternalEvent } from "../event/InternalEvent" - -export class SmartGuide -{ - uuid: string - #smartGuideElement!: HTMLDivElement - #prompterContainerElement!: HTMLDivElement - #prompterTextElement!: HTMLDivElement - #ellipsisElement!: HTMLDivElement - #tagElement!: HTMLDivElement - #candidatesElement!: HTMLDivElement - #menuElement!: HTMLDivElement - #convertElement!: HTMLButtonElement - #copyElement!: HTMLButtonElement - #deleteElement!: HTMLButtonElement - #fadeOutTimout?: ReturnType - #isMenuOpen!: boolean - margin: TMarginConfiguration - renderingConfiguration!: TRenderingConfiguration - jiix?: TJIIXExport - lastWord?: TWordExport - wordToChange?: TWordExport - - constructor() - { - this.uuid = Math.random().toString(10).substring(2, 12) - this.margin = { - bottom: 0, - left: 0, - right: 0, - top: 0 - } - this.#createWrapperElement() - this.#createPrompterContainerElement() - this.#createPrompterTextElement() - this.#createEllipsisElement() - this.#createTagElement() - this.#createCandidatesElement() - this.#createMoreMenuElement() - this.#createConvertElement() - this.#createCopyElement() - this.#createDeleteElement() - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - #createWrapperElement(): void - { - this.#smartGuideElement = document.createElement("div") - this.#smartGuideElement.id = `smartguide-${ this.uuid }` - this.#smartGuideElement.classList.add("smartguide") - } - - #createPrompterContainerElement(): void - { - this.#prompterContainerElement = document.createElement("div") - this.#prompterContainerElement.id = `prompter-container-${ this.uuid }` - this.#prompterContainerElement.classList.add("prompter-container") - // this.#prompterContainerElement.appendChild(textElement) - } - - #createPrompterTextElement(): void - { - this.#prompterTextElement = document.createElement("div") - this.#prompterTextElement.id = `prompter-text-${ this.uuid }` - this.#prompterTextElement.classList.add("prompter-text") - this.#prompterTextElement.setAttribute("touch-action", "none") - } - - #createEllipsisElement(): void - { - this.#ellipsisElement = document.createElement("div") - this.#ellipsisElement.id = `ellipsis-${ this.uuid }` - this.#ellipsisElement.classList.add("ellipsis") - this.#ellipsisElement.innerHTML = "..." - } - - #createTagElement(): void - { - this.#tagElement = document.createElement("div") - this.#tagElement.id = `tag-icon-${ this.uuid }` - this.#tagElement.classList.add("tag-icon") - this.#tagElement.innerHTML = "¶" - } - - #createCandidatesElement(): void - { - this.#candidatesElement = document.createElement("div") - this.#candidatesElement.id = `candidates-${ this.uuid }` - this.#candidatesElement.classList.add("candidates") - } - - #createMoreMenuElement(): void - { - this.#menuElement = document.createElement("div") - this.#menuElement.id = `more-menu-${ this.uuid }` - this.#menuElement.classList.add("more-menu") - } - - #createConvertElement(): void - { - this.#convertElement = document.createElement("button") - this.#convertElement.id = `convert-${ this.uuid }` - this.#convertElement.classList.add("options-label-button") - this.#convertElement.innerHTML = "Convert" - } - - #createCopyElement(): void - { - this.#copyElement = document.createElement("button") - this.#copyElement.id = `copy-${ this.uuid }` - this.#copyElement.classList.add("options-label-button") - this.#copyElement.innerHTML = "Copy" - } - - #createDeleteElement(): void - { - this.#deleteElement = document.createElement("button") - this.#deleteElement.id = `delete-${ this.uuid }` - this.#deleteElement.classList.add("options-label-button") - this.#deleteElement.innerHTML = "Delete" - } - - init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void - { - domElement.appendChild(this.#smartGuideElement) - this.#smartGuideElement.appendChild(this.#tagElement) - - this.#prompterContainerElement.appendChild(this.#prompterTextElement) - this.#smartGuideElement.appendChild(this.#prompterContainerElement) - - this.#smartGuideElement.appendChild(this.#ellipsisElement) - - this.#menuElement.appendChild(this.#convertElement) - this.#menuElement.appendChild(this.#copyElement) - this.#menuElement.appendChild(this.#deleteElement) - this.#smartGuideElement.appendChild(this.#menuElement) - this.#menuElement.classList.add("close") - this.#isMenuOpen = false - - this.#smartGuideElement.appendChild(this.#candidatesElement) - this.#candidatesElement.style.display = "none" - this.margin = margin - this.renderingConfiguration = renderingConfiguration - this.#addListeners() - - this.#show() - if (this.renderingConfiguration.smartGuide.fadeOut.enable) { - this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration) - } - - this.resize() - } - - #initFadeOutObserver(duration = 3000): void - { - const observer = new MutationObserver(() => - { - clearTimeout(this.#fadeOutTimout) - if ( - !this.#smartGuideElement.classList.contains("smartguide-out") && - this.#candidatesElement.style.display === "none" && - !this.#isMenuOpen - ) { - this.#fadeOutTimout = setTimeout(() => - { - this.#hide() - }, duration) - } - }) - observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true }) - } - - #show(): void - { - this.#smartGuideElement.classList.remove("smartguide-out") - this.#smartGuideElement.classList.add("smartguide-in") - } - #hide(): void - { - this.#smartGuideElement.classList.add("smartguide-out") - this.#smartGuideElement.classList.remove("smartguide-in") - } - - #showCandidates = (target: HTMLElement) => - { - const wordId = parseInt(target.id.replace("word-", "").replace(this.uuid, "")) - const words = this.jiix?.words as TWordExport[] - this.wordToChange = words[wordId] - if (this.wordToChange) { - this.wordToChange.id = wordId.toString() - this.#candidatesElement.innerHTML = "" - if (this.wordToChange?.candidates) { - this.#candidatesElement.style.display = "flex" - this.wordToChange.candidates.forEach((word, index) => - { - if (this.wordToChange?.label === word) { - this.#candidatesElement.innerHTML += `${ word }` - } else { - this.#candidatesElement.innerHTML += `${ word }` - } - }) - const top = 48 - const left = target.getBoundingClientRect().left - 60 - this.#candidatesElement.style.top = `${ top }px` - this.#candidatesElement.style.left = `${ left }px` - - const parent = target.parentNode?.parentNode?.parentNode - if (parent) { - parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode) - } - } - } - } - #hideCandidates(): void - { - this.#candidatesElement.style.display = "none" - } - - #openMenu(): void - { - this.#menuElement.classList.add("open") - this.#menuElement.classList.remove("close") - this.#isMenuOpen = true - } - #closeMenu(): void - { - this.#menuElement.classList.add("close") - this.#menuElement.classList.remove("open") - this.#isMenuOpen = false - } - - #onClickEllipsis = (evt: Event) => - { - evt.preventDefault() - evt.stopPropagation() - this.#isMenuOpen ? this.#closeMenu() : this.#openMenu() - this.#hideCandidates() - } - - #onClickConvert = (evt: Event) => - { - evt.preventDefault() - evt.stopPropagation() - this.internalEvent.emitConvert() - this.#closeMenu() - } - - #onClickCopy = async (evt: Event): Promise => - { - evt.preventDefault() - evt.stopPropagation() - try { - this.#closeMenu() - let message = "Nothing to copy" - if (this.#prompterTextElement.innerText) { - message = `"${ this.#prompterTextElement.innerText }" copied to clipboard` - await navigator.clipboard.writeText(this.#prompterTextElement.innerText) - } - this.internalEvent.emitNotif({ message, timeout: 1500 }) - } catch (err) { - this.internalEvent.emitError(err as Error) - } - } - - #onClickDelete = (evt: Event) => - { - evt.preventDefault() - evt.stopPropagation() - this.internalEvent.emitClear() - this.#closeMenu() - } - - #onClickCandidate = (evt: Event) => - { - evt.preventDefault() - evt.stopPropagation() - const target = evt.target as HTMLElement - const candidate = target.innerText - if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) { - this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate - this.internalEvent.emitImportJIIX(this.jiix) - } - this.#candidatesElement.style.display = "none" - } - - #onClickPrompter = (evt: Event): void => - { - evt.preventDefault() - evt.stopPropagation() - this.#closeMenu() - const target = evt.target as HTMLElement - if (target.id !== this.#prompterTextElement.id) { - this.#showCandidates(target) - } else { - this.#hideCandidates() - } - - } - - #onClickOutSide = () => - { - this.#hideCandidates() - this.#closeMenu() - } - - #addListeners(): void - { - this.#ellipsisElement.addEventListener("pointerdown", evt => this.#onClickEllipsis(evt)) - this.#convertElement.addEventListener("pointerdown", evt => this.#onClickConvert(evt)) - this.#copyElement.addEventListener("pointerdown", evt => this.#onClickCopy(evt)) - this.#deleteElement.addEventListener("pointerdown", evt => this.#onClickDelete(evt)) - this.#prompterTextElement.addEventListener("pointerdown", evt => this.#onClickPrompter(evt)) - this.#candidatesElement.addEventListener("pointerdown", evt => this.#onClickCandidate(evt)) - document.addEventListener("pointerdown", () => this.#onClickOutSide()) - } - - resize(): void - { - const mmToPixels = 3.779527559 - const marginTop = this.margin.top * mmToPixels - const marginLeft = this.margin.left * mmToPixels - const marginRight = this.margin.right * mmToPixels - // 12 is the space between line in mm - const top = marginTop - (12 * mmToPixels) - - this.#smartGuideElement.style.top = `${ top }px` - this.#smartGuideElement.style.left = `${ marginLeft }px` - this.#smartGuideElement.style.right = `${ marginRight }px` - - let left = this.#tagElement.offsetWidth - this.#prompterContainerElement.style.marginLeft = `${ left }px` - this.#prompterContainerElement.style.width = `${ this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight }px` - left += this.#prompterContainerElement.offsetWidth - this.#menuElement.style.left = `${ left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth }px` - this.#menuElement.style.top = `${ this.#ellipsisElement.offsetHeight }px` - this.#ellipsisElement.style.left = `${ left }px` - } - - update(exports: TJIIXExport): void - { - this.jiix = exports - const createWordSpan = (index: number, word?: TWordExport) => - { - const span = document.createElement("span") - span.id = `word-${ index }${ this.uuid }` - if (word) { - span.textContent = word.label - } else { - span.innerHTML = " " - } - return span - } - - const populatePrompter = () => - { - this.#prompterTextElement.innerHTML = "" - if (this.jiix?.words) { - const words = this.jiix.words as TWordExport[] - const myFragment = document.createDocumentFragment() - words.forEach((word, index) => - { - if (word.label === " " || word.label.includes("\n")) { - myFragment.appendChild(createWordSpan(index)) - } else if (index !== words.length - 1) { - myFragment.appendChild(createWordSpan(index, word)) - } else { - this.#prompterTextElement.appendChild(myFragment) - if (this.lastWord) { - this.lastWord = word - } - const span = createWordSpan(index, word) - // This is used to scroll to last word if last word is modified - if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) { - span.classList.add("added-word") - this.#prompterTextElement.appendChild(span) - this.#prompterContainerElement.scrollLeft = span.offsetLeft - this.lastWord = word - } else { - this.#prompterTextElement.appendChild(span) - this.#prompterContainerElement.scrollLeft = span.offsetLeft - } - } - }) - } - } - populatePrompter() - if (this.jiix?.words?.length) { - this.#show() - } - } - - clear(): void - { - this.#prompterTextElement.innerHTML = "" - this.#candidatesElement.innerHTML = "" - this.#hide() - } - - destroy(): void - { - this.#smartGuideElement.innerHTML = "" - } -} diff --git a/src/style/DefaultPenStyle.ts b/src/style/DefaultPenStyle.ts deleted file mode 100644 index d6b60dc4..00000000 --- a/src/style/DefaultPenStyle.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" - -export const DefaultPenStyle: TPenStyle = {} \ No newline at end of file diff --git a/src/style/DefaultTheme.ts b/src/style/DefaultTheme.ts deleted file mode 100644 index 6dedb440..00000000 --- a/src/style/DefaultTheme.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { TTheme } from "../@types/style/Theme" - -export const DefaultTheme: TTheme = { - ink: { - color: "#000000", - width: 1, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "#A8A8A8FF" - }, - ".text": { - "font-family": "MyScriptInter", - "font-size": 10 - } -} diff --git a/src/style/StyleHelper.ts b/src/style/StyleHelper.ts deleted file mode 100644 index 7a114238..00000000 --- a/src/style/StyleHelper.ts +++ /dev/null @@ -1,51 +0,0 @@ -import JsonCSS from "json-css" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const parser: any = new JsonCSS() - -export default { - themeToCSS(json: TTheme): string - { - return parser.toCSS(json) as string - // css = css.replace( /[\r\n]+/gm, "" ) - // return css - }, - themeToJSON(style: string): TTheme - { - const theme = parser.toJSON(style) as TTheme - theme[".text"]["font-size"] = Number(theme[".text"]["font-size"]) - theme.ink["-myscript-pen-width"] = Number(theme.ink["-myscript-pen-width"]) - theme.ink.width = Number(theme.ink.width) - return theme - }, - penStyleToCSS (penStyle: TPenStyle): string { - let css = parser.toCSS({ css: penStyle }) as string - css = css.substring(6, css.length - 3) - return css - }, - penStyleToJSON (penStyleString: string): TPenStyle { - const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle - if (penStyle.width) { - penStyle.width = Number(penStyle.width) - } else { - delete penStyle.width - } - if (penStyle["-myscript-pen-width"]) { - penStyle["-myscript-pen-width"] = Number(penStyle["-myscript-pen-width"]) - } else { - delete penStyle["-myscript-pen-width"] - } - return penStyle - }, - - stringToJSON(style: string): {[key: string]: string} - { - return parser.toJSON(`css {${style}}`).css - }, - JSONToString(style: {[key: string]: string}): string - { - return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(";") - } -} diff --git a/src/style/StyleManager.ts b/src/style/StyleManager.ts deleted file mode 100644 index 435d2d71..00000000 --- a/src/style/StyleManager.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { TTheme } from "../@types/style/Theme" -import { TPenStyle } from "../@types/style/PenStyle" - -import { mergeDeep } from "../utils/MergeHelper" - -import { DefaultPenStyle } from "./DefaultPenStyle" -import { DefaultTheme } from "./DefaultTheme" - -export class StyleManager -{ - #penStyle!: TPenStyle - #theme!: TTheme - #penStyleClasses!: string - #currentPenStyle!: TPenStyle - - constructor(penStyle?: TPenStyle, theme?: TTheme) - { - this.setTheme(theme) - this.setPenStyleClasses() - this.setPenStyle(penStyle) - } - - get currentPenStyle(): TPenStyle - { - return this.#currentPenStyle || this.#penStyle - } - - get penStyle(): TPenStyle - { - return this.#penStyle - } - setPenStyle(p?: TPenStyle) - { - - this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), p || {}) as TPenStyle - this.#currentPenStyle = p || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle - } - - get theme(): TTheme - { - return this.#theme - } - setTheme(t?: TTheme) - { - this.#theme = mergeDeep(structuredClone(DefaultTheme), t || {}) as TTheme - } - - get penStyleClasses(): string - { - return this.#penStyleClasses - } - setPenStyleClasses(psc = "") - { - this.#penStyleClasses = psc - this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle - } - -} diff --git a/src/style/index.ts b/src/style/index.ts deleted file mode 100644 index 9564ae3e..00000000 --- a/src/style/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { DefaultPenStyle } from "./DefaultPenStyle" -export { DefaultTheme } from "./DefaultTheme" -export { default as StyleHelper } from "./StyleHelper" -export { StyleManager } from "./StyleManager" diff --git a/src/undo-redo/UndoRedoContext.ts b/src/undo-redo/UndoRedoContext.ts deleted file mode 100644 index 82b54c84..00000000 --- a/src/undo-redo/UndoRedoContext.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IModel } from "../@types/model/Model" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" - -export class UndoRedoContext implements TUndoRedoContext -{ - canUndo: boolean - canRedo: boolean - empty: boolean - stackIndex: number - possibleUndoCount: number - stack: IModel[] - - constructor(model: IModel) - { - this.stackIndex = 0 - this.possibleUndoCount = 0 - this.canRedo = false - this.canUndo = false - this.empty = true - this.stack = [model.getClone()] - } -} diff --git a/src/undo-redo/UndoRedoManager.ts b/src/undo-redo/UndoRedoManager.ts deleted file mode 100644 index 29372b45..00000000 --- a/src/undo-redo/UndoRedoManager.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { IModel } from "../@types/model/Model" -import { InternalEvent } from "../event/InternalEvent" -import { UndoRedoContext } from "./UndoRedoContext" - -export class UndoRedoManager -{ - context: UndoRedoContext - configuration: TUndoRedoConfiguration - - constructor(configuration: TUndoRedoConfiguration, model: IModel) - { - this.configuration = configuration - this.context = new UndoRedoContext(model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - private updateCanUndoRedo(): void - { - this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex - this.context.canUndo = this.context.stackIndex > 0 - const currentModel = this.context.stack[this.context.stackIndex] - this.context.empty = currentModel.rawStrokes.length === 0 - } - - addModelToStack(model: IModel): void - { - if (this.context.stackIndex + 1 < this.context.stack.length) { - this.context.stack.splice(this.context.stackIndex + 1) - } - - this.context.stackIndex++ - this.context.stack.push(model.getClone()) - - if (this.context.stack.length > this.configuration.maxStackSize) { - this.context.stack.shift() - this.context.stackIndex-- - } - - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - - removeLastModelInStack(): void - { - if (this.context.stackIndex === this.context.stack.length - 1) { - this.context.stackIndex-- - } - this.context.stack.pop() - this.updateCanUndoRedo() - } - - updateModelInStack(model: IModel): void - { - const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate) - if (index > -1) { - this.context.stack.splice(index, 1, model.getClone()) - } - this.internalEvent.emitContextChange(this.context) - } - - undo(): IModel - { - if (this.context.canUndo) { - this.context.stackIndex-- - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - return this.context.stack[this.context.stackIndex].getClone() - } - - redo(): IModel - { - if (this.context.canRedo) { - this.context.stackIndex++ - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - return this.context.stack[this.context.stackIndex].getClone() - } - - reset(model: IModel): void - { - this.context = new UndoRedoContext(model) - this.internalEvent.emitContextChange(this.context) - } - -} diff --git a/src/undo-redo/index.ts b/src/undo-redo/index.ts deleted file mode 100644 index 407c8949..00000000 --- a/src/undo-redo/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { UndoRedoContext } from "./UndoRedoContext" -export { UndoRedoManager } from "./UndoRedoManager" diff --git a/src/utils/DeferredPromise.ts b/src/utils/DeferredPromise.ts deleted file mode 100644 index 86c0afd5..00000000 --- a/src/utils/DeferredPromise.ts +++ /dev/null @@ -1,32 +0,0 @@ - -export class DeferredPromise { - promise: Promise - resolve!: (value: T) => void - reject!: (value: Error) => void - - isFullFilled: boolean - isPending: boolean - - - constructor() - { - this.isFullFilled = false - this.isPending = true - - this.promise = new Promise((resolve, reject) => - { - this.reject = async (v: unknown) => - { - this.isFullFilled = true - this.isPending = false - return reject(v) - } - this.resolve = async (v: unknown) => - { - this.isFullFilled = true - this.isPending = false - return resolve(v as T) - } - }) - } -} diff --git a/src/utils/MergeHelper.ts b/src/utils/MergeHelper.ts deleted file mode 100644 index edd59e73..00000000 --- a/src/utils/MergeHelper.ts +++ /dev/null @@ -1,26 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const mergeDeep = (target: any, ...sources: any[]): any => - { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const isObject = (item: any) => - { - return (item && typeof item === "object" && !Array.isArray(item)) - } - if (!sources.length) return target - const source = sources.shift() - - if (isObject(target) && isObject(source)) { - for (const key in source) { - if (isObject(source[key])) { - if (!target[key]) { - Object.assign(target, { [key]: {} }) - } - mergeDeep(target[key], source[key]) - } else { - Object.assign(target, { [key]: source[key] }) - } - } - } - - return mergeDeep(target, ...sources) - } \ No newline at end of file diff --git a/src/utils/font.ts b/src/utils/font.ts deleted file mode 100644 index 96cd73ce..00000000 --- a/src/utils/font.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TConfigurationClient } from "../@types/Configuration" - -export async function getAvailableFontList(configuration: TConfigurationClient): Promise> -{ - if (!configuration?.server?.scheme && !configuration?.server?.host) { - return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - } - if (!configuration?.recognition?.lang) { - return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!") - } - const serverConfig = configuration.server - const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang) - const { result } = await response.json() - return result.sort() -} diff --git a/src/utils/geometric.ts b/src/utils/geometric.ts deleted file mode 100644 index c0911494..00000000 --- a/src/utils/geometric.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TPoint } from "../@types/geometry" - -export function computeDistance(p1: TPoint, p2: TPoint): number -{ - const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x) - return isNaN(distance) ? 0 : distance -} diff --git a/src/utils/index.ts b/src/utils/index.ts deleted file mode 100644 index a25885de..00000000 --- a/src/utils/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { DeferredPromise } from "./DeferredPromise" -export * as geometric from "./geometric" -export * as version from "./version" -export { getAvailableFontList } from "./font" -export { getAvailableLanguageList } from "./language" diff --git a/src/utils/language.ts b/src/utils/language.ts deleted file mode 100644 index 6dfe580b..00000000 --- a/src/utils/language.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TConfigurationClient } from "../@types/Configuration" - -export async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>> -{ - if (configuration?.server?.scheme && configuration?.server?.host) { - const serverConfig = configuration.server - const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`) - return response.json() - } else { - return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - } -} diff --git a/src/utils/version.ts b/src/utils/version.ts deleted file mode 100644 index 8e97eb7f..00000000 --- a/src/utils/version.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export const isVersionSuperiorOrEqual = (source: string, target: string): boolean => -{ - const sourceParts = source.split(".") - const targetParts = target.split(".") - - for (let i = 0; i < targetParts.length; i++) { - const a = Number(targetParts[i]) - const b = Number(sourceParts[i]) - if (a > b) return false - if (a < b) return true - } - return true -} diff --git a/test/.eslintrc.js b/test/.eslintrc.js deleted file mode 100644 index 2c4bdaf9..00000000 --- a/test/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - globals: { - browser: true, - page: true, - expect: true - }, - extends: [ - 'standard' - ], - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module' - } -} diff --git a/test/integration/01-home/home.test.js b/test/integration/01-home/home.test.js deleted file mode 100644 index fc53982e..00000000 --- a/test/integration/01-home/home.test.js +++ /dev/null @@ -1,88 +0,0 @@ -describe('Home Page', () => -{ - beforeAll(async () => { - await page.goto('/examples/index.html') - }) - - test('should have title', async () => - { - const title = await page.title() - expect(title).toMatch('iinkTS: Examples') - }) - - test('should display table of content', async () => - { - const tableOfContent = await page.locator('#table-of-content') - expect(await tableOfContent.isVisible()).toBe(true) - }) - - test('each table of contents link must be associated with a section part', async () => - { - const links = await page.locator('#table-of-content li') - const sectionParts = await page.locator('.title') - const linksCount = await links.count() - const secctionPartsCount = await sectionParts.count() - expect(linksCount).toBe(secctionPartsCount) - - for (let i = 0; i < linksCount; i++) { - const linkHref = await links.nth(i).locator('a').getAttribute('href') - const sectionPartName = await sectionParts.nth(i).getAttribute('name') - expect(linkHref).toBe('#' + sectionPartName) - } - }) - - test('each example-item should have 2 links', async () => - { - const exampleItems = await page.locator('.example-item') - - for (let i = 0; i < await exampleItems.count(); i++) { - const exampleItemsTitle = await exampleItems.nth(i).locator('p strong').textContent() - expect(exampleItemsTitle).toBeDefined() - - const links = await exampleItems.nth(i).locator('a') - expect(await links.count()).toBe(2) - - const exampleLink = links.nth(0) - const codeLink = links.nth(1) - - const exampleLinkText = await exampleLink.allInnerTexts() - expect(exampleLinkText.length).toBe(1) - expect(exampleLinkText[0].trim()).toBe('View example') - - const codeLinkText = await codeLink.allInnerTexts() - expect(codeLinkText.length).toBe(1) - expect(codeLinkText[0].trim()).toBe('Get source code') - expect(await codeLink.getAttribute('href')).toContain('https://github.com/MyScript') - } - }) - - test('each "View example" link should ok', async () => - { - const exampleLink = await page.locator('text=View example') - const linksInErrors = [] - for (let i = 0; i < await exampleLink.count(); i++) { - const link = exampleLink.nth(i) - const href = await link.getAttribute('href') - - const [response] = await Promise.all([ - page.waitForResponse((response) => response.url().includes(href)), - link.click() - ]) - if (response.status() !== 200) { - linksInErrors.push(href) - } - await page.goBack() - } - expect(linksInErrors).toStrictEqual([]) - }) - test('each "Get source code" link should ok', async () => - { - const codeLinks = await page.locator('text=Get source code') - const exampleLinks = await page.locator('text=View example') - for(let i = 0; i < await exampleLinks.count(); i++) { - const exampleHref = await exampleLinks.nth(i).getAttribute('href') - const linkHref = await codeLinks.nth(i).getAttribute("href") - expect(linkHref).toEqual(`https://github.com/MyScript/iinkTS/blob/master/examples/${exampleHref}`) - } - }) -}) \ No newline at end of file diff --git a/test/integration/02-rest/rest-diagram.test.js b/test/integration/02-rest/rest-diagram.test.js deleted file mode 100644 index 897d6779..00000000 --- a/test/integration/02-rest/rest-diagram.test.js +++ /dev/null @@ -1,166 +0,0 @@ -const { - waitForEditorRest, - write, - getExportedDatas, - setEditorConfiguration, - getEditorConfiguration, - getEditorModelExports, -} = require('../helper') -const { rectangle, line } = require('../strokesDatas') - -describe('Rest Diagram', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_diagram_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Diagram') - }) - - test('should display application/vnd.myscript.jiix into result', async () => { - const [lineExportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, [rectangle.strokes[0]]), - ]) - const lineResultText = await page.locator('#result').textContent() - const lineResultJson = JSON.parse(lineResultText) - expect(lineResultJson).toEqual(lineExportedDatas) - expect(lineExportedDatas['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports[0]['application/vnd.myscript.jiix']) - - const [rectExportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, [rectangle.strokes[1]]), - ]) - const rectResultText = await page.locator('#result').textContent() - const rectResultJson = JSON.parse(rectResultText) - expect(rectResultJson).toEqual(rectExportedDatas) - expect(rectExportedDatas['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports[1]['application/vnd.myscript.jiix']) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request application/vnd.myscript.jiix by default', async () => { - await Promise.all([ - getExportedDatas(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.myscript.jiix') - }) - - test('should only request application/vnd.openxmlformats-officedocument.presentationml.presentation', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.diagram.mimeTypes = [ - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getExportedDatas(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.openxmlformats-officedocument.presentationml.presentation') - }) - - test('should request application/vnd.myscript.jiix & application/vnd.openxmlformats-officedocument.presentationml.presentation', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.diagram.mimeTypes = [ - 'application/vnd.myscript.jiix', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getExportedDatas(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/vnd.myscript.jiix') - expect(allMimeTypesRequested).toContain('application/vnd.openxmlformats-officedocument.presentationml.presentation') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, line.strokes), - ]) - const resultText = await page.locator('#result').textContent() - const rectResultJson = JSON.parse(resultText) - expect(exportedDatas['application/vnd.myscript.jiix']).toEqual(rectResultJson['application/vnd.myscript.jiix']) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(line.exports[0]['application/vnd.myscript.jiix']) - - expect(await getEditorModelExports(page)).toBeDefined() - - const promisesResult = await Promise.all([ - getExportedDatas(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getEditorModelExports(page)).toBeNull() - - expect(await page.locator('#result').textContent()).toBe('{}') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - await Promise.all([ - getExportedDatas(page), - write(page, [rectangle.strokes[0]]) - ]) - await Promise.all([ - getExportedDatas(page), - write(page, [rectangle.strokes[1]]) - ]) - let resultText = await page.locator('#result').textContent() - let rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-1)['application/vnd.myscript.jiix']) - - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - resultText = await page.locator('#result').textContent() - rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-2)['application/vnd.myscript.jiix']) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length - 1) - - await Promise.all([getExportedDatas(page), page.click('#redo')]) - resultText = await page.locator('#result').textContent() - rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-1)['application/vnd.myscript.jiix']) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length) - }) - }) -}) diff --git a/test/integration/02-rest/rest-math.test.js b/test/integration/02-rest/rest-math.test.js deleted file mode 100644 index 2dda536e..00000000 --- a/test/integration/02-rest/rest-math.test.js +++ /dev/null @@ -1,149 +0,0 @@ -const { - waitForEditorRest, - write, - getExportedDatas, - getEditor, - setEditorConfiguration, - getEditorConfiguration, - getEditorModelExports, -} = require('../helper') -const { equation1, one } = require('../strokesDatas') - -describe('Rest Math', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_math_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Math') - }) - - test('should display katex-html into result', async () => { - let exportedDatas - for (let s of equation1.strokes) { - [exportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, [s]), - ]) - } - - const resultElement = page.locator('#result') - const htmlKatexResult = await resultElement.locator('.katex-html').textContent() - - const exports = await getEditorModelExports(page) - expect(exportedDatas['application/x-latex']).toStrictEqual(equation1.exports.LATEX.at(-1)) - expect(exports['application/x-latex']).toStrictEqual(equation1.exports.LATEX.at(-1)) - expect(htmlKatexResult).toStrictEqual(equation1.exports.LATEX.at(-1)) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request application/x-latex by default', async () => { - await Promise.all([ - getExportedDatas(page), - write(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/x-latex') - }) - - test('should only request application/mathml+xml', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.math.mimeTypes = ['application/mathml+xml'] - await setEditorConfiguration(page, configuration) - - await Promise.all([ - getExportedDatas(page), - write(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/mathml+xml') - }) - - test('should request application/mathml+xml & application/x-latex', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.math.mimeTypes = [ - 'application/mathml+xml', - 'application/x-latex', - ] - await setEditorConfiguration(page, configuration) - - await Promise.all([ - getExportedDatas(page), - write(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/mathml+xml') - expect(allMimeTypesRequested).toContain('application/x-latex') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, one.strokes), - ]) - expect(exportedDatas['application/x-latex']).toStrictEqual(one.exports.LATEX.at(-1)) - - const promisesResult = await Promise.all([ - getExportedDatas(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getEditorModelExports(page)).toBeNull() - - const resultElement = page.locator('#result') - const resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - - await Promise.all([ - getExportedDatas(page), - write(page, equation1.strokes), - ]) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 1) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 2) - - await Promise.all([getExportedDatas(page), page.click('#redo')]) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 1) - }) - }) -}) diff --git a/test/integration/02-rest/rest-text.test.js b/test/integration/02-rest/rest-text.test.js deleted file mode 100644 index 396c48ff..00000000 --- a/test/integration/02-rest/rest-text.test.js +++ /dev/null @@ -1,173 +0,0 @@ -const { - waitForEditorRest, - write, - getExportedDatas, - setEditorConfiguration, - getEditorConfiguration, - waitEditorLoaded, - getEditorModelExports, -} = require('../helper') -const { h, hello } = require('../strokesDatas') - -describe('Rest Text', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_text_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Text') - }) - - test('should display text/plain into result', async () => { - const [exportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request text/plain by default', async () => { - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('text/plain') - }) - - test('should only request application/vnd.myscript.jiix', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.text.mimeTypes = [ - 'application/vnd.myscript.jiix', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.myscript.jiix') - }) - - test('should request application/vnd.myscript.jiix & text/plain', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.text.mimeTypes = [ - 'application/vnd.myscript.jiix', - 'text/plain', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/vnd.myscript.jiix') - expect(allMimeTypesRequested).toContain('text/plain') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - expect(await getEditorModelExports(page)).toBeDefined() - - const promisesResult = await Promise.all([ - getExportedDatas(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getEditorModelExports(page)).toBeNull() - - expect(await page.locator('#result').textContent()).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - - await page.waitForTimeout(1500) - - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-1)) - - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-2)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-3)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 2) - - await Promise.all([getExportedDatas(page), page.click('#redo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-2)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - }) - - test('should change language', async () => { - const [exportedDatas] = await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - await Promise.all([ - waitEditorLoaded(page), - page.selectOption('#language', 'fr_FR'), - ]) - - expect(await page.locator('#result').textContent()).toBe('') - }) - }) -}) diff --git a/test/integration/03-websocket/websocket-export-on-demand.test.js b/test/integration/03-websocket/websocket-export-on-demand.test.js deleted file mode 100644 index b9626b58..00000000 --- a/test/integration/03-websocket/websocket-export-on-demand.test.js +++ /dev/null @@ -1,31 +0,0 @@ -const { helloHowAreYou } = require('../strokesDatas') -const { waitForEditorWebSocket, waitEditorIdle, getEditorModelExports, write } = require('../helper') - -describe('Websocket on-demand export', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_export_on_demand.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket on-demand export') - }) - - test('should not export', async () => { - await write(page, helloHowAreYou.strokes) - await waitEditorIdle(page) - const exports = await getEditorModelExports(page) - expect(exports).toBeUndefined() - expect(await page.locator("#result").textContent()).toEqual("") - }) - - test('should export on click', async () => { - await page.click("#export") - await waitEditorIdle(page) - const exports = await getEditorModelExports(page) - const jiix = exports['application/vnd.myscript.jiix'] - expect(jiix.label).toEqual(helloHowAreYou.exports["text/plain"].at(-1)) - expect(await page.locator("#result").textContent()).toEqual(helloHowAreYou.exports["text/plain"].at(-1)) - }) -}) diff --git a/test/integration/03-websocket/websocket-handle_errors.test.js b/test/integration/03-websocket/websocket-handle_errors.test.js deleted file mode 100644 index 31c58bf5..00000000 --- a/test/integration/03-websocket/websocket-handle_errors.test.js +++ /dev/null @@ -1,17 +0,0 @@ - describe("Websocket Text", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_handle_errors.html") - await page.waitForSelector(".message") - }) - - test("should have title", async () => { - - const title = await page.title() - expect(title).toMatch("Handle error") - }) - - test("should have error message", async () => { - const errorMessage = await page.locator(".message.error-msg").textContent() - expect(errorMessage).toStrictEqual("Application credentials are invalid. Please check or regenerate your application key and hmackey.") - }) - }) diff --git a/test/integration/03-websocket/websocket-math-custom-resources.test.js b/test/integration/03-websocket/websocket-math-custom-resources.test.js deleted file mode 100644 index c32ac0ae..00000000 --- a/test/integration/03-websocket/websocket-math-custom-resources.test.js +++ /dev/null @@ -1,90 +0,0 @@ -const { waitForEditorWebSocket, writePointers, write, getExportedDatas, getEditorModelExportsType, waitEditorIdle, getEditorConfiguration, setEditorConfiguration } = require("../helper") -const { sumSimple, h } = require("../strokesDatas") - -describe("Websocket Math", function () { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_math_custom_resources.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom resources math") - }) - - test("should only export latex by default", async () => { - for (const s of sumSimple.strokes) { - await Promise.all([getExportedDatas(page), writePointers(page, [s], 100, 100)]) - } - const jiix = await getEditorModelExportsType(page, "application/vnd.myscript.jiix") - expect(jiix).toBeUndefined() - const latex = await getEditorModelExportsType(page, "application/x-latex") - expect(latex).toBeDefined() - const mathml = await getEditorModelExportsType(page, "application/mathml+xml") - expect(mathml).toBeUndefined() - }) - - test("should undo/redo", async () => { - const editorEl = await page.waitForSelector("#editor") - for (const s of sumSimple.strokes) { - await Promise.all([getExportedDatas(page), writePointers(page, [s])]) - } - - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(sumSimple.exports["LATEX"].at(-1)) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(sumSimple.strokes.length) - - await Promise.all([getExportedDatas(page), page.click("#undo")]) - resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(sumSimple.exports["LATEX"].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(sumSimple.strokes.length - 1) - }) - - test("should clear", async () => { - await Promise.all([getExportedDatas(page), writePointers(page, sumSimple.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toBeDefined() - - const [clearExport] = await Promise.all([getExportedDatas(page), page.click("#clear")]) - const emptyLatex = "" - const LatexReceived = clearExport["application/x-latex"] - expect(LatexReceived).toEqual(emptyLatex) - - const modelExportLatex = await getEditorModelExportsType(page, "application/x-latex") - expect(modelExportLatex).toEqual(LatexReceived) - resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toBe("") - }) - - test("should not recognize text", async () => { - await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).not.toEqual("h") - }) - - test("should change configuration and recognize text", async () => { - - const config = await getEditorConfiguration(page) - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - const [exportedDatas] = await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - const latexReceived = exportedDatas["application/x-latex"] - expect(resultText).toEqual("h") - }) -}) diff --git a/test/integration/03-websocket/websocket-math-eraser.test.js b/test/integration/03-websocket/websocket-math-eraser.test.js deleted file mode 100644 index 8563e87f..00000000 --- a/test/integration/03-websocket/websocket-math-eraser.test.js +++ /dev/null @@ -1,18 +0,0 @@ - -const { waitForEditorWebSocket } = require('../helper') - -describe('Websocket Math Eraser', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_iink_eraser.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Math Eraser') - }) -}) diff --git a/test/integration/03-websocket/websocket-math-import-jiix.test.js b/test/integration/03-websocket/websocket-math-import-jiix.test.js deleted file mode 100644 index 1aa51441..00000000 --- a/test/integration/03-websocket/websocket-math-import-jiix.test.js +++ /dev/null @@ -1,25 +0,0 @@ - -const { waitForEditorWebSocket, waitEditorIdle, getEditorModelExportsType, haveSameLabels } = require('../helper') - -describe('Websocket Math Import JIIX', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_import_jiix.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Import math with JIIX') - }) - - test('should import JIIX', async () => { - await page.click('#import') - await waitEditorIdle(page) - - const jiix = await getEditorModelExportsType(page, "application/vnd.myscript.jiix") - const jiixTextToImport = await page.locator("#jiix").textContent() - const jiixToImport = JSON.parse(jiixTextToImport) - expect(haveSameLabels(jiix, jiixToImport)).toEqual(true) - }) - -}) diff --git a/test/integration/03-websocket/websocket-math-inside-page.test.js b/test/integration/03-websocket/websocket-math-inside-page.test.js deleted file mode 100644 index f367a6b0..00000000 --- a/test/integration/03-websocket/websocket-math-inside-page.test.js +++ /dev/null @@ -1,105 +0,0 @@ -const { haveSameLabels, write, getEditorModelExports, getImportedDatas, getExportedDatas, waitEditorLoaded, waitEditorIdle } = require("../helper") - -const mathContentList = [ - { - id: "eq-1", - latex: "a^{2}+b^{2}=c^{2}", - textContent: "a2+b2=c2", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [159, 157, 156, 154, 150, 149, 146, 143, 142, 138, 144, 149, 154, 159, 162, 166, 169, 168, 169, 169, 169, 168, 168, 168, 168], "y": [174, 177, 180, 183, 188, 191, 195, 199, 202, 205, 204, 204, 204, 204, 204, 202, 202, 205, 208, 212, 216, 219, 222, 225, 229], "t": [1689858551959, 1689858552062, 1689858552078, 1689858552094, 1689858552112, 1689858552128, 1689858552162, 1689858552194, 1689858552228, 1689858552261, 1689858552711, 1689858552727, 1689858552744, 1689858552761, 1689858552835, 1689858552877, 1689858552910, 1689858553177, 1689858553193, 1689858553227, 1689858553243, 1689858553260, 1689858553277, 1689858553431, 1689858553460], "p": [0.5, 0.81, 0.68, 0.7, 0.77, 0.68, 0.74, 0.74, 0.68, 0.74, 0.77, 0.74, 0.74, 0.74, 0.68, 0.73, 0.68, 0.68, 0.68, 0.71, 0.71, 0.68, 0.68, 0.68, 0.71] }], - latexAfterWriting: "4a^{2}+b^{2}=c^{2}" - }, - { - id: "eq-2", - latex: "c=\\sqrt{a^{2}+b^{2}}", - textContent: "c=a2+b2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [190, 190, 191, 192, 193, 195, 198, 201, 206, 211, 215, 218, 222, 224, 226, 227, 227, 227, 226, 225, 225, 222, 221, 218, 214, 210, 208, 205, 201, 198, 206, 215, 228, 238, 247, 255], "y": [194, 191, 188, 183, 180, 176, 174, 172, 171, 171, 172, 173, 175, 178, 181, 184, 187, 192, 195, 198, 201, 206, 209, 213, 217, 220, 224, 227, 230, 233, 232, 231, 231, 231, 231, 231], "t": [1689859052854, 1689859052908, 1689859052922, 1689859052956, 1689859052972, 1689859052989, 1689859053054, 1689859053092, 1689859053122, 1689859053139, 1689859053155, 1689859053189, 1689859053222, 1689859053238, 1689859053272, 1689859053289, 1689859053306, 1689859053339, 1689859053356, 1689859053372, 1689859053389, 1689859053421, 1689859053438, 1689859053472, 1689859053489, 1689859053522, 1689859053555, 1689859053589, 1689859053621, 1689859053739, 1689859053922, 1689859053938, 1689859053955, 1689859053971, 1689859053988, 1689859054005], "p": [0.5, 0.83, 0.68, 0.75, 0.68, 0.73, 0.7, 0.7, 0.75, 0.74, 0.72, 0.68, 0.73, 0.7, 0.7, 0.68, 0.68, 0.74, 0.68, 0.68, 0.68, 0.76, 0.68, 0.74, 0.76, 0.74, 0.73, 0.72, 0.74, 0.72, 0.8, 0.81, 0.64, 0.68, 0.81, 0.8] }], - latexAfterWriting: "2c=\\sqrt{a^{2}+b^{2}}" - }, - { - id: "eq-3", - latex: "a=\\sqrt{c^{2}-b^{2}}", - textContent: "a=c2−b2​", - strokesToWrite: [{"pointerType":"mouse","pointerId":0,"x":[406,411,415,421,432,456,489,530,579,608,624,631,634,637,645,657,668,674,679,684,688,691,694,700,704],"y":[248,246,246,245,245,244,240,240,240,242,240,240,240,240,240,239,238,237,237,237,238,238,236,235,235],"t":[1689870299381,1689870299471,1689870299487,1689870299504,1689870299521,1689870299537,1689870299554,1689870299571,1689870299587,1689870299603,1689870299620,1689870299637,1689870299670,1689870299687,1689870299703,1689870299720,1689870299736,1689870299753,1689870299771,1689870299786,1689870299804,1689870300048,1689870300070,1689870300086,1689870300103],"p":[0.5,0.77,0.71,0.77,0.67,0.51,0.42,0.36,0.3,0.46,0.6,0.78,0.68,0.68,0.8,0.65,0.67,0.77,0.74,0.74,0.72,0.68,0.7,0.77,0.71]},{"pointerType":"mouse","pointerId":0,"x":[537,540,546,551,558,561,561,561,561,560,555,549,548,555,559,565,568,571,575,580,583],"y":[276,271,269,266,264,266,270,278,288,300,309,318,321,317,316,315,314,314,313,312,311],"t":[1689870300721,1689870300819,1689870300836,1689870300852,1689870300869,1689870300969,1689870300986,1689870301002,1689870301018,1689870301035,1689870301053,1689870301069,1689870301102,1689870301252,1689870301269,1689870301286,1689870301302,1689870301335,1689870301402,1689870301419,1689870301436],"p":[0.5,0.76,0.77,0.76,0.79,0.7,0.71,0.8,0.68,0.65,0.68,0.67,0.68,0.8,0.72,0.77,0.68,0.68,0.72,0.75,0.68]}], - latexAfterWriting: "a=\\dfrac{\\sqrt{c^{2}-b^{2}}}{2}" - }, - { - id: "eq-4", - latex: "b=\\sqrt{c^{2}-a^{2}}", - textContent: "b=c2−a2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [403, 400, 396, 392, 389, 387, 385, 383, 383, 381, 379, 378, 376, 375, 374, 374, 374, 374, 375, 375, 374, 374, 374, 375, 376, 377, 379, 385, 389, 392, 396, 398, 399, 399, 399, 398, 396, 393, 388, 385, 382, 379, 376], "y": [127, 129, 132, 135, 139, 142, 145, 149, 154, 159, 163, 167, 173, 177, 180, 183, 186, 189, 192, 197, 204, 214, 221, 224, 227, 230, 233, 237, 238, 238, 231, 225, 220, 216, 213, 210, 206, 204, 204, 204, 204, 204, 207], "t": [1689860222378, 1689860222480, 1689860222497, 1689860222531, 1689860222563, 1689860222580, 1689860222597, 1689860222630, 1689860222664, 1689860222681, 1689860222697, 1689860222713, 1689860222747, 1689860222764, 1689860222781, 1689860222797, 1689860222813, 1689860222830, 1689860222847, 1689860222864, 1689860222880, 1689860222897, 1689860222914, 1689860222930, 1689860222947, 1689860222963, 1689860222980, 1689860222997, 1689860223013, 1689860223030, 1689860223130, 1689860223146, 1689860223163, 1689860223180, 1689860223197, 1689860223213, 1689860223230, 1689860223263, 1689860223297, 1689860223313, 1689860223330, 1689860223364, 1689860223446], "p": [0.5, 0.81, 0.74, 0.74, 0.74, 0.7, 0.7, 0.73, 0.74, 0.75, 0.73, 0.72, 0.77, 0.72, 0.68, 0.68, 0.68, 0.68, 0.68, 0.74, 0.79, 0.68, 0.78, 0.68, 0.68, 0.68, 0.7, 0.79, 0.72, 0.68, 0.8, 0.77, 0.75, 0.71, 0.68, 0.68, 0.73, 0.7, 0.74, 0.68, 0.68, 0.68, 0.72] }], - latexAfterWriting: "b=6\\sqrt{c^{2}-a^{2}}" - }, -] - -describe("Websocket Math Inside Page", function () { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_math_inside_page.html") - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Dynamic math part inside a page") - }) - - mathContentList.forEach(async (mc) => { - describe(`Math content for ${mc.id}`, () => { - let currentExport - let currentTextContent - - afterAll(async () => { - await page.reload({ waitUntil: "networkidle" }) - }) - - test(`should open modal editor`, async () => { - await waitEditorIdle(page) - expect(await page.locator("#editorContainer").isVisible()).toEqual(false) - currentTextContent = await page.locator(`#${mc.id} .katex-html`).textContent() - expect(currentTextContent).toEqual(mc.textContent) - await Promise.all([ - getImportedDatas(page), - page.locator(`#${ mc.id }`).click() - ]) - await waitEditorIdle(page) - expect(await page.locator("#editorContainer").isVisible()).toEqual(true) - }) - - test(`should import data-jiix`, async () => { - currentExport = await getEditorModelExports(page) - const jiixExpected = JSON.parse(await page.locator(`#${ mc.id }`).getAttribute("data-jiix")) - expect(haveSameLabels(currentExport["application/vnd.myscript.jiix"], jiixExpected)).toEqual(true) - expect(currentExport["application/x-latex"]).toEqual(mc.latex) - }) - - test(`should update equation`, async () => { - await Promise.all([ - getExportedDatas(page), - write(page, mc.strokesToWrite) - ]) - await waitEditorIdle(page) - currentExport = await getEditorModelExports(page) - expect(currentExport['application/x-latex']).toEqual(mc.latexAfterWriting) - }) - - test(`should close modal editor`, async () => { - await page.locator("#close").click() - expect(await page.locator("#editorContainer").isVisible()).toEqual(false) - }) - - test(`should update math content`, async () => { - expect(await page.locator(`#${mc.id} .katex-html`).textContent()).not.toEqual(currentTextContent) - }) - - test(`should re-open modal editor with new equation`, async () => { - await Promise.all([ - getImportedDatas(page), - page.locator(`#${ mc.id }`).click() - ]) - await waitEditorIdle(page) - expect(await page.locator("#editorContainer").isVisible()).toEqual(true) - currentExport = await getEditorModelExports(page) - expect(currentExport['application/x-latex']).toEqual(mc.latexAfterWriting) - }) - }) - }) - -}) diff --git a/test/integration/03-websocket/websocket-math.test.js b/test/integration/03-websocket/websocket-math.test.js deleted file mode 100644 index 10ebd224..00000000 --- a/test/integration/03-websocket/websocket-math.test.js +++ /dev/null @@ -1,313 +0,0 @@ - -const { - waitForEditorWebSocket, - write, - getExportedDatas, - getEditorModelExportsType, - getEditorConfiguration, - setEditorConfiguration, - getEditorModelConverts, - getConvertedDatas, - getEditorModelExports, - waitEditorIdle -} = require('../helper') -const { equation1, fence, sum } = require('../strokesDatas') - -describe('Websocket Math', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Math') - }) - - test('should only export latex by default', async () => { - for(const s of equation1.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s], 100, 100) - ]) - } - const jiix = await getEditorModelExportsType(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeUndefined() - const latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(latex).toBeDefined() - const mathml = await getEditorModelExportsType(page, 'application/mathml+xml') - expect(mathml).toBeUndefined() - }) - - test('should only export jiix', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/vnd.myscript.jiix'] - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - for(const s of equation1.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s], 100, 100) - ]) - } - const latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(latex).toBeUndefined() - const jiix = await getEditorModelExportsType(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeDefined() - const mathml = await getEditorModelExportsType(page, 'application/mathml+xml') - expect(mathml).toBeUndefined() - }) - - test('should only export mathml+xml', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - for(const s of equation1.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s], 100, 100) - ]) - } - const latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(latex).toBeUndefined() - const jiix = await getEditorModelExportsType(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeUndefined() - const mathml = await getEditorModelExportsType(page, 'application/mathml+xml') - expect(mathml).toBeDefined() - }) - - test('should undo/redo in mode "stroke" by default', async () => { - const config = await getEditorConfiguration(page) - expect(config.recognition.math['undo-redo'].mode).toEqual('stroke') - - let latex - let nbStroke = 0 - for(const s of equation1.strokes) { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, [s]) - ]) - expect(equation1.exports.LATEX.at(nbStroke)).toEqual(exports['application/x-latex']) - nbStroke++ - } - - const [clearExport] = await Promise.all([ - getExportedDatas(page), - page.click('#clear') - ]) - const modelExportCleared = await getEditorModelExports(page) - if (modelExportCleared) { - expect(modelExportCleared['application/x-latex']).toEqual('') - expect(clearExport['application/x-latex']).toEqual('') - } - - const [undo1Export] = await Promise.all([ - getExportedDatas(page), - page.click('#undo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(undo1Export['application/x-latex']).toEqual(latex) - expect(equation1.exports.LATEX.at(-1)).toEqual(undo1Export['application/x-latex']) - - await waitEditorIdle(page) - const [undo2Export] = await Promise.all([ - getExportedDatas(page), - page.click('#undo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(undo2Export['application/x-latex']).toEqual(latex) - expect(equation1.exports.LATEX.at(-2)).toEqual(undo2Export['application/x-latex']) - - await waitEditorIdle(page) - const [undo3Export] = await Promise.all([ - getExportedDatas(page), - page.click('#undo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(undo3Export['application/x-latex']).toEqual(latex) - expect(equation1.exports.LATEX.at(-3)).toEqual(undo3Export['application/x-latex']) - - await waitEditorIdle(page) - const [redoExport] = await Promise.all([ - getExportedDatas(page), - page.click('#redo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(redoExport['application/x-latex']).toEqual(latex) - expect(equation1.exports.LATEX.at(-2)).toEqual(redoExport['application/x-latex']) - }) - - test('should undo/redo in mode "session"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/x-latex'] - config.recognition.math['undo-redo'].mode = 'session' - // 5000 = time to write equation1 - config.recognition.math['session-time'] = 5000 - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - let latex - await Promise.all([ - getExportedDatas(page), - write(page, equation1.strokes) - ]) - await waitEditorIdle(page) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(latex).toEqual(equation1.exports.LATEX.at(-1)) - - const [clearExport] = await Promise.all([ - getExportedDatas(page), - page.click('#clear') - ]) - const modelExportCleared = await getEditorModelExports(page) - if (modelExportCleared) { - expect(modelExportCleared['application/x-latex']).toEqual('') - expect(clearExport['application/x-latex']).toEqual('') - } - - await waitEditorIdle(page) - const [undo1Export] = await Promise.all([ - getExportedDatas(page), - page.click('#undo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(undo1Export['application/x-latex']).toEqual(latex) - expect(undo1Export['application/x-latex']).toEqual(equation1.exports.LATEX.at(-1)) - - await waitEditorIdle(page) - const [undo2Export] = await Promise.all([ - getExportedDatas(page), - page.click('#undo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(undo2Export['application/x-latex']).toEqual(latex) - expect(latex).toEqual('') - - await waitEditorIdle(page) - const [redoExport] = await Promise.all([ - getExportedDatas(page), - page.click('#redo') - ]) - latex = await getEditorModelExportsType(page, 'application/x-latex') - expect(redoExport['application/x-latex']).toEqual(latex) - expect(redoExport['application/x-latex']).toEqual(equation1.exports.LATEX.at(-1)) - }) - - test('should convert svg path', async () => { - for(const s of equation1.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s], 100, 100) - ]) - } - const emptyConvert = await getEditorModelConverts(page) - expect(emptyConvert).toBeUndefined() - expect(await page.locator('path').count()).toEqual(equation1.strokes.length) - - await Promise.all([ - getConvertedDatas(page), - page.click('#convert') - ]) - - await waitEditorIdle(page) - expect(await page.locator('path').count()).toEqual(equation1.exports.LATEX.at(-1).length) - - const convert = await getEditorModelConverts(page) - const laextExport = await getEditorModelExportsType(page, 'application/x-latex') - expect(convert['application/x-latex']).toEqual(laextExport) - expect(laextExport).toEqual(equation1.exports.LATEX.at(-1)) - }) - - test('should convert and solve sum by default', async () => { - const config = await getEditorConfiguration(page) - expect(config.recognition.math.solver.enable).toEqual(true) - let numStroke = 0 - for(const s of sum.strokes) { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, [s]) - ]) - expect(exports['application/x-latex']).toEqual(sum.exports.LATEX.at(numStroke)) - numStroke++ - } - const emptyConvert = await getEditorModelConverts(page) - expect(emptyConvert).toBeUndefined() - - await Promise.all([ - getConvertedDatas(page), - page.click('#convert') - ]) - const convert = await getEditorModelConverts(page) - expect(convert['application/x-latex']).toEqual(sum.converts.LATEX.at(-1)) - expect(await page.locator('#result').locator('.katex-html').textContent()).toEqual(sum.converts.LATEX.at(-1)) - }) - - test('should convert and not solve sum', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.solver.enable = false - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - let numStroke = 0 - for(const s of sum.strokes) { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, [s]) - ]) - expect(exports['application/x-latex']).toEqual(sum.exports.LATEX.at(numStroke)) - numStroke++ - } - const emptyConvert = await getEditorModelConverts(page) - expect(emptyConvert).toBeUndefined() - - await Promise.all([ - getConvertedDatas(page), - page.click('#convert') - ]) - const convert = await getEditorModelConverts(page) - const laextExport = await getEditorModelExportsType(page, 'application/x-latex') - expect(convert['application/x-latex']).toEqual(laextExport) - expect(laextExport).toEqual(sum.exports.LATEX.at(-1)) - expect(await page.locator('#result').locator('.katex-html').textContent()).toEqual(sum.exports.LATEX.at(-1)) - }) - - test('should export mathml with flavor "standard"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - config.recognition.export.mathml = { flavor: 'standard' } - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - for(const s of fence.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s]) - ]) - } - const mathml = await getEditorModelExportsType(page, 'application/mathml+xml') - expect(mathml.trim().replace(/ /g, '')).toEqual(fence.exports.MATHML.STANDARD[fence.exports.MATHML.STANDARD.length - 1].trim().replace(/ /g, '')) - }) - - test('should export mathml with flavor "ms-office"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - config.recognition.export.mathml = { flavor: 'ms-office' } - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - for(const s of fence.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s]) - ]) - } - const mathml = await getEditorModelExportsType(page, 'application/mathml+xml') - expect(mathml.trim().replace(/ /g, '')).toEqual(fence.exports.MATHML.MSOFFICE[fence.exports.MATHML.MSOFFICE.length - 1].trim().replace(/ /g, '')) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-custom-lexicon.test.js b/test/integration/03-websocket/websocket-text-custom-lexicon.test.js deleted file mode 100644 index 502bb677..00000000 --- a/test/integration/03-websocket/websocket-text-custom-lexicon.test.js +++ /dev/null @@ -1,42 +0,0 @@ -const { write, waitForEditorWebSocket, getEditorModelExports, waitEditorIdle } = require("../helper") -const { claclacla } = require("../strokesDatas") - -describe("Websocket Text Custom Lexicon", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_custom_lexicon.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom lexicon") - }) - - test("should not recognize 'claclacla'", async () => { - await write(page, claclacla.strokes) - await waitEditorIdle(page) - const exports = await getEditorModelExports(page) - const jiixExpected = claclacla.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived).not.toEqual(jiixExpected) - }) - - test("should send lexicon data with jiix", async () => { - await Promise.all([ - waitForEditorWebSocket(page), - page.locator("#lexicon").fill("claclacla"), - page.locator("#reinit").click(), - ]) - await write(page, claclacla.strokes) - await waitEditorIdle(page) - const exports = await getEditorModelExports(page) - const jiixExpected = claclacla.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).toEqual(jiixExpected.label) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-custom-resources.test.js b/test/integration/03-websocket/websocket-text-custom-resources.test.js deleted file mode 100644 index 0344962f..00000000 --- a/test/integration/03-websocket/websocket-text-custom-resources.test.js +++ /dev/null @@ -1,29 +0,0 @@ -const { write, getExportedDatas, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { abrausorus } = require("../strokesDatas") - -describe("Websocket Text Custom Resource", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_custom_resources.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom pre-loaded resources") - }) - - test("should export application/vnd.myscript.jiix", async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, abrausorus.strokes), - ]) - await waitEditorIdle(page) - const jiixExpected = abrausorus.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).toEqual(jiixExpected.label) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js b/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js deleted file mode 100644 index 0922d51b..00000000 --- a/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js +++ /dev/null @@ -1,113 +0,0 @@ -const { waitForEditorWebSocket, write, getExportedDatas } = require('../helper') -const { h } = require('../strokesDatas') - -function hexToRgbA(hex) { - let c - if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) { - c = hex.substring(1).split('') - if (c.length == 3) { - c = [c[0], c[0], c[1], c[1], c[2], c[2]] - } - c = '0x' + c.join('') - return ( - 'rgba(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(', ') + ', 1)' - ) - } - throw new Error('Bad Hex') -} - -describe('Websocket Text Customize Stroke Style', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_customize_stroke_style.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Text Styling') - }) - - test('should draw stroke with DefaultTheme', async () => { - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - const defaultThemeColor = await page.evaluate('editor.theme.ink.color') - const path = page.locator(`path[fill="${hexToRgbA(defaultThemeColor)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with penStyleClasses', async () => { - await page.click('#penStyleClasses') - - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - - const editorTheme = await page.evaluate('editor.theme') - const editorPenStyleClasses = await page.evaluate('editor.penStyleClasses') - const penColorExpected = editorTheme[`.${editorPenStyleClasses}`].color - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with theme', async () => { - await page.selectOption('#theme', 'bold-red'), - - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - - const editorTheme = await page.evaluate('editor.theme') - const penColorExpected = editorTheme.ink.color - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with default penStyle', async () => { - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - await page.setChecked('#penenabled', true) - expect(await page.locator('#pencolor').isDisabled()).toEqual(false) - expect(await page.locator('#penwidth').isDisabled()).toEqual(false) - - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - - const editorPenStyle = await page.evaluate('editor.penStyle') - const path = page.locator(`path[fill="${hexToRgbA(editorPenStyle.color)}"]`) - expect(await path.count()).toEqual(1) - - await page.setChecked('#penenabled', false) - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - }) - - test('should draw stroke with selected penStyle', async () => { - const penColorExpected = '#1a5fb4' - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - - await page.setChecked('#penenabled', true) - expect(await page.locator('#pencolor').isDisabled()).toEqual(false) - expect(await page.locator('#penwidth').isDisabled()).toEqual(false) - - await page.fill('#pencolor', penColorExpected) - - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-erase.test.js b/test/integration/03-websocket/websocket-text-erase.test.js deleted file mode 100644 index b5796f10..00000000 --- a/test/integration/03-websocket/websocket-text-erase.test.js +++ /dev/null @@ -1,74 +0,0 @@ -const { waitForEditorWebSocket, write, getExportedDatas, waitEditorIdle } = require('../helper') -const { ponyErase, ponyErasePrecisely } = require('../strokesDatas') - -describe('Websocket Text erase', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_iink_eraser.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Text Eraser') - }) - - test('should toggle mode writing <-> erasing', async () => { - expect(await page.locator("#pen").isDisabled()).toBe(true) - expect(await page.locator("#eraser").isDisabled()).toBe(false) - expect(await page.locator("#editor").getAttribute('class')).not.toContain('erasing') - await page.click("#eraser") - expect(await page.locator("#pen").isDisabled()).toBe(false) - expect(await page.locator("#eraser").isDisabled()).toBe(true) - expect(await page.locator("#editor").getAttribute('class')).toContain('erasing') - }) - - test('should export erase stroke', async () => { - const [ponyExports] = await Promise.all([ - getExportedDatas(page), - write(page, [ponyErase.strokes[0]]), - ]) - const ponyJiixExpected = ponyErase.exports[0]['application/vnd.myscript.jiix'] - const ponyJiixReceived = ponyExports['application/vnd.myscript.jiix'] - expect(ponyJiixReceived.label).toEqual(ponyJiixExpected.label) - - await page.click("#eraser") - - const [ponyEraseExports] = await Promise.all([ - getExportedDatas(page), - write(page, [ponyErase.strokes[1]]), - ]) - const ponyEraseJiixExpected = ponyErase.exports[1]['application/vnd.myscript.jiix'] - const ponyEraseJiixReceived = ponyEraseExports['application/vnd.myscript.jiix'] - expect(ponyEraseJiixReceived.label).toEqual(ponyEraseJiixExpected.label) - }) - - test('should export erase stroke precisely', async () => { - await Promise.all([ - waitForEditorWebSocket(page), - page.click("#erase-precisely") - ]) - await waitEditorIdle(page) - - const [ponyExports] = await Promise.all([ - getExportedDatas(page), - write(page, [ponyErasePrecisely.strokes[0]]), - ]) - const ponyJiixExpected = ponyErasePrecisely.exports[0]['application/vnd.myscript.jiix'] - const ponyJiixReceived = ponyExports['application/vnd.myscript.jiix'] - expect(ponyJiixReceived.label).toEqual(ponyJiixExpected.label) - - await page.click("#eraser") - - const [ponyEraseExports] = await Promise.all([ - getExportedDatas(page), - write(page, [ponyErasePrecisely.strokes[1]]), - ]) - const ponyEraseJiixExpected = ponyErasePrecisely.exports[1]['application/vnd.myscript.jiix'] - const ponyEraseJiixReceived = ponyEraseExports['application/vnd.myscript.jiix'] - expect(ponyEraseJiixReceived.label).toEqual(ponyEraseJiixExpected.label) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-file-export.test.js b/test/integration/03-websocket/websocket-text-file-export.test.js deleted file mode 100644 index 1caf0466..00000000 --- a/test/integration/03-websocket/websocket-text-file-export.test.js +++ /dev/null @@ -1,71 +0,0 @@ -const { write, getExportedDatas, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { hello } = require("../strokesDatas") - -describe("Websocket Text file export", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_file_export.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Word Export with iink") - }) - - test("should write and save to word file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.docx"); - }) - - test("should write and save to html file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'html'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.html"); - }) - - test("should write and save to png file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'png'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.png"); - }) - - test("should write and save to jpg file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'jpeg'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.jpg"); - }) - -}) diff --git a/test/integration/03-websocket/websocket-text-highlight-words.test.js b/test/integration/03-websocket/websocket-text-highlight-words.test.js deleted file mode 100644 index 7a268c70..00000000 --- a/test/integration/03-websocket/websocket-text-highlight-words.test.js +++ /dev/null @@ -1,140 +0,0 @@ -const { waitForEditorWebSocket, write, getExportedDatas, waitEditorIdle } = require("../helper") -const { helloOneSurrounded, helloOneStroke } = require("../strokesDatas") - -const getComputedStyle = async (locator) => { - return locator.evaluate((el) => { - const cs = window.getComputedStyle(el) - return { - color: cs.color, - backgroundColor: cs.backgroundColor - } - }) -} - -const colorMap = [ - { - id: "black-btn", - color: "rgb(0, 0, 0)" - }, - { - id: "dark-grey-btn", - color: "rgb(128, 128, 128)" - }, - { - id: "light-grey-btn", - color: "rgb(217, 217, 217)" - }, - { - id: "blue-btn", - color: "rgb(26, 140, 255)" - }, - { - id: "red-btn", - color: "rgb(255, 26, 64)" - }, - { - id: "green-btn", - color: "rgb(43, 217, 101)" - }, - { - id: "yellow-btn", - color: "rgb(255, 221, 51)" - }, - -] - -describe("Websocket Text highlight words", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_highlight_words.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Highlight words') - }) - - test('should write and isn\'t in list', async () => { - await Promise.all([ - write(page, helloOneStroke.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - - test('should write, surround and is in list', async () => { - await Promise.all([ - write(page, helloOneSurrounded.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain("rgb(128, 128, 128)") - }) - - test("should write, surround and is in list then remove from list", async () => { - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - await Promise.all([ - write(page, helloOneSurrounded.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - await Promise.all([ - getExportedDatas(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - - for (let index = 0; index < colorMap.length; index++) { - test(`should write text in color${colorMap[index].id} and highlight them`, async () => { - const currentColor = colorMap[index] - await Promise.all([ - getExportedDatas(page), - write(page, [helloOneSurrounded.strokes[0]]) - ]) - await page.locator(`#${currentColor.id}`).click() - await Promise.all([ - getExportedDatas(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain(currentColor.color) - await Promise.all([ - getExportedDatas(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - } - - test("should write in color and surround with another color", async () => { - const strokeColor = colorMap[4] - const highlightColor = colorMap[5] - await page.click(`#${strokeColor.id}`) - await Promise.all([ - getExportedDatas(page), - write(page, [helloOneSurrounded.strokes[0]]) - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - - await page.click(`#${highlightColor.id}`) - await Promise.all([ - getExportedDatas(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain(highlightColor.color) - expect(style.color).toContain(strokeColor.color) - }) - -}) diff --git a/test/integration/03-websocket/websocket-text-iink-no-guides.test.js b/test/integration/03-websocket/websocket-text-iink-no-guides.test.js deleted file mode 100644 index a695a3f9..00000000 --- a/test/integration/03-websocket/websocket-text-iink-no-guides.test.js +++ /dev/null @@ -1,38 +0,0 @@ -const { write, getExportedDatas, waitForEditorWebSocket } = require("../helper") -const { helloOneStroke } = require("../strokesDatas") - - describe("Websocket Text Search Without Smartguide", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink_no_guides.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("No guides") - }) - - test("should draw stroke hello", async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, helloOneStroke.strokes), - ]) - - const jiixExpected = helloOneStroke.exports["application/vnd.myscript.jiix"].label - const jiixReceived = exports["application/vnd.myscript.jiix"].label - expect(jiixReceived).toStrictEqual(jiixExpected) - }) - - test("should not see guides", async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, helloOneStroke.strokes), - ]) - const line = await page.locator("line").all() - expect(line.length).toEqual(0) - }) - }) diff --git a/test/integration/03-websocket/websocket-text-iink-search.test.js b/test/integration/03-websocket/websocket-text-iink-search.test.js deleted file mode 100644 index d57befce..00000000 --- a/test/integration/03-websocket/websocket-text-iink-search.test.js +++ /dev/null @@ -1,47 +0,0 @@ -const { write, getExportedDatas, waitForEditorWebSocket } = require("../helper") -const { hello } = require("../strokesDatas") - -describe("Websocket Text search", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink_search.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Text search") - }) - - test("should find text", async () => { - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - - const inputSearch = page.locator("#searchInput") - await Promise.all([ - inputSearch.type("hello"), - page.click("#searchBtn") - ]) - - //wait for css highlight - await page.waitForTimeout(1000) - const highlight = page.locator(".highlight") - expect(highlight).toBeDefined() - }) - - test("should failed to find", async () => { - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - - page.locator("#searchInput").type("test") - await page.click("#searchBtn") - expect(await page.locator(".highlight").count()).toEqual(0) - }) -}) \ No newline at end of file diff --git a/test/integration/03-websocket/websocket-text-import-content.test.js b/test/integration/03-websocket/websocket-text-import-content.test.js deleted file mode 100644 index 344882f7..00000000 --- a/test/integration/03-websocket/websocket-text-import-content.test.js +++ /dev/null @@ -1,53 +0,0 @@ -const { waitForEditorWebSocket, write, getExportedDatas, waitEditorIdle } = require('../helper') -const { h } = require('../strokesDatas') - -describe('Websocket Text Import Content', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_import_content.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Import') - }) - - test('should export application/vnd.myscript.jiix', async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - const jiixExpected = h.exports['application/vnd.myscript.jiix'] - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived).toEqual(jiixExpected) - }) - - test('should import text hello', async () => { - await Promise.all([ - page.locator("#importContentField").fill("hello"), - page.locator("#importContent").click(), - getExportedDatas(page), - ]) - - const prompterText = await page.waitForSelector('.prompter-text') - const textContent = await prompterText.evaluate((node) => node.textContent) - expect(textContent).toEqual("hello") - }) - - test('should import text pony', async () => { - await Promise.all([ - page.locator("#importContentField").fill("pony"), - page.locator("#importContent").click(), - getExportedDatas(page), - ]) - - const prompterText = await page.waitForSelector('.prompter-text') - const textContent = await prompterText.evaluate((node) => node.textContent) - expect(textContent).toEqual("pony") - }) -}) diff --git a/test/integration/03-websocket/websocket-text-interact.test.js b/test/integration/03-websocket/websocket-text-interact.test.js deleted file mode 100644 index 1a761899..00000000 --- a/test/integration/03-websocket/websocket-text-interact.test.js +++ /dev/null @@ -1,107 +0,0 @@ -const { write, getExportedDatas, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { paris, tokyo, madrid, rome, buenosAires } = require("../strokesDatas") - - -describe("Websocket Text interact", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_interact.html") - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Interact with your app") - }) - - test(`should ask teh capital of France`, async () => { - const question = await page.locator("#question").textContent() - expect(question).toEqual("What is the capital of France?") - }) - - test(`should answer question capital of France`, async () => { - const [exportParis] = await Promise.all([ - getExportedDatas(page), - write(page, paris.strokes, -100) - ]) - await waitEditorIdle(page) - let textExpected = paris.exports["application/vnd.myscript.jiix"].label - let textReceived = exportParis["text/plain"] - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#nextButton").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Italy") - }) - - test(`should answer question capital of Italy`, async () => { - const [exportRomes] = await Promise.all([ - getExportedDatas(page), - write(page, rome.strokes, -100) - ]) - await waitEditorIdle(page) - textExpected = rome.exports["application/vnd.myscript.jiix"].label - textReceived = exportRomes["text/plain"] - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#nextButton").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Spain") - }) - - test(`should answer question capital of Spain`, async () => { - const [exportMadrid] = await Promise.all([ - getExportedDatas(page), - write(page, madrid.strokes, -100) - ]) - await waitEditorIdle(page) - textExpected = madrid.exports["application/vnd.myscript.jiix"].label - textReceived = exportMadrid["text/plain"] - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#nextButton").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Argentina") - }) - - test(`should answer question capital of Argentina`, async () => { - let exportBuenosAires - for (let s of buenosAires.strokes) { - [exportBuenosAires] = await Promise.all([ - getExportedDatas(page), - write(page, [s], -100, -200) - ]) - } - await waitEditorIdle(page) - textExpected = buenosAires.exports["application/vnd.myscript.jiix"].label - textReceived = exportBuenosAires["text/plain"] - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#nextButton").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Japan") - }) - - test(`should answer question capital of Japan`, async () => { - const [exportTokyo] = await Promise.all([ - getExportedDatas(page), - write(page, tokyo.strokes) - ]) - await waitEditorIdle(page) - textExpected = tokyo.exports["application/vnd.myscript.jiix"].label - textReceived = exportTokyo["text/plain"] - expect(textReceived).toStrictEqual(textExpected) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-local-storage.test.js b/test/integration/03-websocket/websocket-text-local-storage.test.js deleted file mode 100644 index cfd3ad94..00000000 --- a/test/integration/03-websocket/websocket-text-local-storage.test.js +++ /dev/null @@ -1,46 +0,0 @@ -const { waitForEditorWebSocket, write, getExportedDatas, getEditorModelExportsType, waitEditorIdle } = require('../helper') -const { helloOneStroke } = require('../strokesDatas') - -describe('Websocket Text local storage', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_local_storage_text.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('WEBSOCKET Text iink') - }) - - test('should export text/plain', async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, helloOneStroke.strokes), - ]) - //add delay to save text in localstorage - await page.waitForTimeout(400) - const jiixExpected = helloOneStroke.exports['text/plain'][0] - const jiixReceived = exports['text/plain'] - await page.locator("#clearStorage").click() - expect(jiixReceived).toStrictEqual(jiixExpected) - }) - - test('should get hello in localstorage', async () => { - await page.locator("#clearStorage").click() - await Promise.all([ - getExportedDatas(page), - write(page, helloOneStroke.strokes) - ]) - - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - - const exports = await getEditorModelExportsType(page, "application/vnd.myscript.jiix") - expect(exports.label).toEqual("hello") - }) -}) diff --git a/test/integration/03-websocket/websocket-text-multiple-inputs.test.js b/test/integration/03-websocket/websocket-text-multiple-inputs.test.js deleted file mode 100644 index 21e364ea..00000000 --- a/test/integration/03-websocket/websocket-text-multiple-inputs.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const { waitForEditorWebSocket, writePointers, waitEditorIdle } = require('../helper') -const { centralProcessingUnit, oneThousandNineHundredAndFortyThree, oneThousandNineHundredAndNintyThree } = require('../strokesDatas') - -const switchToOtherQuestion = async (page, inputId) => { - return Promise.all([ - page.locator(`#${inputId}`).click(), - waitEditorIdle(page) - ]) -} - -const getAnswerText = async (page, answerId) => { - return (await page.locator(`#${answerId}`).textContent()).replace(/[\r\n]+/gm, " ").replace(" ", " ").toLocaleLowerCase() -} - -describe('Websocket Text Multiple Inputs', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_multiple_inputs.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Multiple inputs') - }) - - const data0 = { - inputId: "input-0", - answerId: "answer-0", - text: centralProcessingUnit, - } - - test('should answer the first question', async () => { - await writePointers(page, data0.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data0.answerId) - expect(answerText).toEqual(data0.text.exports["text/plain"]) - }) - - test('should validate the first answer', async () => { - expect(await page.locator(`#${data0.answerId}`).getAttribute('class')).not.toContain('success') - await page.click("#validate-answers") - expect(await page.locator(`#${data0.answerId}`).getAttribute('class')).toContain('success') - }) - - const data1 = { - inputId: "input-1", - answerId: "answer-1", - text: oneThousandNineHundredAndFortyThree, - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data1.inputId) - await writePointers(page, data1.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data1.answerId) - expect(answerText).toEqual(data1.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).toContain('success') - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).not.toContain('error') - }) - - const data2 = { - inputId: "input-2", - answerId: "answer-2", - text: oneThousandNineHundredAndFortyThree - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data2.inputId) - await writePointers(page, data2.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data2.answerId) - expect(answerText).toEqual(data2.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).toContain('error') - }) - - const data3 = { - inputId: "input-3", - answerId: "answer-3", - text: oneThousandNineHundredAndNintyThree, - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data3.inputId) - await writePointers(page, data3.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data3.answerId) - expect(answerText).toEqual(data3.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).toContain('success') - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).not.toContain('error') - }) - -}) diff --git a/test/integration/03-websocket/websocket-text-pointer-events.test.js b/test/integration/03-websocket/websocket-text-pointer-events.test.js deleted file mode 100644 index d905d009..00000000 --- a/test/integration/03-websocket/websocket-text-pointer-events.test.js +++ /dev/null @@ -1,38 +0,0 @@ -const { waitForEditorWebSocket, write, getExportedDatas, waitEditorIdle } = require('../helper') -const { h } = require('../strokesDatas') - -describe('Websocket Text Pointer Events', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_pointer_events.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'networkidle'}) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Pointer events') - }) - - test('should export application/vnd.myscript.jiix', async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - const jiixExpected = h.exports['application/vnd.myscript.jiix'] - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived).toEqual(jiixExpected) - }) - - test('should import points with button', async () => { - const [exports] = await Promise.all([ - getExportedDatas(page), - page.locator('#pointerEvents').click(), - ]) - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived.label).toStrictEqual("A") - }) -}) diff --git a/test/integration/03-websocket/websocket-text.test.js b/test/integration/03-websocket/websocket-text.test.js deleted file mode 100644 index c377c06b..00000000 --- a/test/integration/03-websocket/websocket-text.test.js +++ /dev/null @@ -1,198 +0,0 @@ -const { - waitForEditorWebSocket, - write, - getExportedDatas, - getEditorModelExportsType, - getEditorConfiguration, - setEditorConfiguration, - getEditorModelConverts, - waitEditorIdle -} = require("../helper") -const { h, hello, helloOneStroke, helloStrikeStroke } = require("../strokesDatas") - -describe("Websocket Text", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Websocket Text") - }) - - test("should export application/vnd.myscript.jiix", async () => { - const [exports] = await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - const jiixExpected = h.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - const modelExportJiixReceived = await getEditorModelExportsType(page, "application/vnd.myscript.jiix") - expect(jiixReceived).toEqual(modelExportJiixReceived) - expect(jiixReceived).toEqual(jiixExpected) - }) - - describe("Gesture", () => { - test("should apply gesture", async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.gesture.enable = true - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - const [firstModelExports] = await Promise.all([getExportedDatas(page), write(page, [helloStrikeStroke.strokes[0]])]) - const firstJiixExport = firstModelExports["application/vnd.myscript.jiix"] - expect(firstJiixExport.label).toEqual(helloStrikeStroke.exports["text/plain"][0]) - - const [secondModelExports] = await Promise.all([getExportedDatas(page), write(page, [helloStrikeStroke.strokes[1]])]) - const secondJiixExport = secondModelExports["application/vnd.myscript.jiix"] - expect(secondJiixExport.label).toEqual("") - }) - - test("should not apply gesture", async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.gesture.enable = false - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - const [firstModelExports] = await Promise.all([getExportedDatas(page), write(page, [helloStrikeStroke.strokes[0]])]) - const firstJiixExport = firstModelExports["application/vnd.myscript.jiix"] - expect(firstJiixExport.label).toEqual(helloStrikeStroke.exports["text/plain"][0]) - - const [secondModelExports] = await Promise.all([getExportedDatas(page), write(page, [helloStrikeStroke.strokes[1]])]) - const secondJiixExport = secondModelExports["application/vnd.myscript.jiix"] - expect(secondJiixExport.label).not.toEqual("") - }) - }) - - describe("SmartGuide", () => { - test("should not display", async () => { - const configuration = await getEditorConfiguration(page) - configuration.rendering.smartGuide.enable = false - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - - // wait css animation - await page.waitForTimeout(1000) - expect(await page.locator(".prompter-text").isVisible()).toBe(false) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should display", async () => { - const configuration = await getEditorConfiguration(page) - configuration.rendering.smartGuide.enable = true - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - - // wait css animation - await page.waitForTimeout(1000) - expect(await page.locator(".prompter-text").isVisible()).toBe(true) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should display text into", async () => { - await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - - const textExpected = h.exports["text/plain"].at(-1) - const textExpectedWithNbsp = textExpected.replace(/\s/g, "\u00A0") - - const prompterText = await page.waitForSelector(".prompter-text") - const textContent = await prompterText.evaluate((node) => node.textContent) - - expect(textExpectedWithNbsp).toEqual(textContent) - }) - - test("should select candidate", async () => { - await Promise.all([ - getExportedDatas(page), - write(page, hello.strokes) - ]) - await waitEditorIdle(page) - const jiixExport = await getEditorModelExportsType(page, "application/vnd.myscript.jiix") - expect(await page.innerText(".prompter-text")).toBe(jiixExport.label) - expect(await page.locator(".candidates").isVisible()).toBe(false) - - // wait css animation - await page.waitForTimeout(1000) - await page.click(`.prompter-text > span`) - expect(await page.locator(".candidates").isVisible()).toBe(true) - const candidate = jiixExport.words[0].candidates[2] - - await Promise.all([getExportedDatas(page), page.click(`.candidates > span >> text=${candidate}`)]) - - expect(await page.innerText(".prompter-text")).toBe(candidate) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should convert", async () => { - await Promise.all([getExportedDatas(page), write(page, helloOneStroke.strokes)]) - const emptyConvert = await getEditorModelConverts(page) - expect(emptyConvert).toBeUndefined() - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - const wrotePath = await page.locator("path").first().getAttribute("d") - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - - await Promise.all([getExportedDatas(page), page.click(`.more-menu > button >> text=Convert`)]) - - const convert = await getEditorModelConverts(page) - expect(convert).toBeDefined() - - const convertedPath = await page.locator("path").first().getAttribute("d") - expect(wrotePath).not.toEqual(convertedPath) - }) - - test.skip("should Copy", async () => { - await write(page, h.strokes) - await getExportedDatas(page) - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - - let pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(1) - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - await page.click(`.more-menu > button >> text=Copy`) - - const clipboardCopy = page.evaluate(`(async () => { return await navigator.clipboard.readText() })()`) - expect(clipboardCopy).toEqual(h.label) - }) - - test("should Delete", async () => { - await Promise.all([getExportedDatas(page), write(page, h.strokes)]) - - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - - let pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(1) - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - - await Promise.all([getExportedDatas(page), page.click(`.more-menu > button >> text=Delete`)]) - - // wait for css animation - await page.waitForTimeout(1000) - - pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(0) - }) - }) - - require("../_partials/nav-actions-test") -}) diff --git a/test/integration/_partials/nav-actions-test.js b/test/integration/_partials/nav-actions-test.js deleted file mode 100644 index bf8bd512..00000000 --- a/test/integration/_partials/nav-actions-test.js +++ /dev/null @@ -1,89 +0,0 @@ -const { getExportedDatas, write, getEditorModelExportsType, waitEditorIdle } = require("../helper") -const { h, hello } = require("../strokesDatas") - -describe('Nav actions', () => { - test('should clear', async () => { - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - let resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toBeDefined() - - const [clearExport] = await Promise.all([ - getExportedDatas(page), - page.click('#clear'), - ]) - const emptyJiix = { "type": "Text", "label": "", "words": [ ], "version": "3", "id": "MainBlock"} - const jjixReceived = clearExport['application/vnd.myscript.jiix'] - expect(jjixReceived).toEqual(emptyJiix) - - const modelExportJIIX = await getEditorModelExportsType(page, 'application/vnd.myscript.jiix') - expect(modelExportJIIX).toEqual(jjixReceived) - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - for(const s of hello.strokes) { - await Promise.all([ - getExportedDatas(page), - write(page, [s]), - ]) - } - - let resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(hello.exports['text/plain'].at(-1)) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(hello.exports['text/plain'].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - - await Promise.all([getExportedDatas(page), page.click('#undo')]) - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(hello.exports['text/plain'].at(-3)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 2) - - await Promise.all([getExportedDatas(page), page.click('#redo')]) - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(hello.exports['text/plain'].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - }) - - test('should change language', async () => { - await Promise.all([ - getExportedDatas(page), - write(page, h.strokes), - ]) - - await waitEditorIdle(page) - - let resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - await Promise.all([ - getExportedDatas(page), - page.selectOption('#language', 'fr_FR'), - ]) - - await waitEditorIdle(page) - - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) -}) diff --git a/test/integration/helper.js b/test/integration/helper.js deleted file mode 100644 index 239d166b..00000000 --- a/test/integration/helper.js +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @param {Page} page - Playwright Page - * @param {Array} strokes - * @param {Object} strokes[0] - * @param {Array} strokes[0].x - * @param {Number} strokes[0].x[0] - * @param {Array} strokes[0].y - * @param {Number} strokes[0].y[0] - * @param {Array} [strokes[0].t] - * @param {Number} strokes[0].t[0] - * @param {Number} [offsetTop=0] - * @param {Number} [offsetLeft=0] - */ -module.exports.write = async (page, strokes, offsetTop = 0, offsetLeft = 0) => { - - const editorEl = await page.waitForSelector('#editor') - const offsetX = offsetLeft + await editorEl.evaluate((node) => node.offsetLeft) - const offsetY = offsetTop + await editorEl.evaluate((node) => node.offsetTop) - - for (const { x, y, t } of strokes) { - const hasTimeStamp = t && t.length === x.length - await page.mouse.move(offsetX + x[0], offsetY + y[0]) - await page.mouse.down() - - let oldTimestamp = hasTimeStamp ? t[0] : null - for (let p = 0; p < x.length; p++) { - let waitTime = 0 - if (hasTimeStamp) { - waitTime = t[p] - oldTimestamp - oldTimestamp = t[p] - } - await page.waitForTimeout(waitTime) - await page.mouse.move(offsetX + x[p], offsetY + y[p]) - } - await page.mouse.up() - await page.waitForTimeout(100) - } -} - -/** - * @param {Page} page - Playwright Page - * @param {Array} strokes - * @param {Object} strokes[0] - * @param {Array} strokes[0].pointers - * @param {Object} strokes[0].pointers[0] - * @param {Number} strokes[0].pointers[0].x - * @param {Number} strokes[0].pointers[0].y - * @param {Number} strokes[0].pointers[0].t - * @param {Number} strokes[0].pointers[0].p - * @param {Number} [offsetTop=0] - * @param {Number} [offsetLeft=0] - */ -module.exports.writePointers = async (page, strokes, offsetTop = 0, offsetLeft = 0) => { - const editorEl = await page.waitForSelector('#editor') - const boundingBox = await editorEl.evaluate((node) => node.getBoundingClientRect()) - const offsetX = offsetLeft + boundingBox.x - const offsetY = offsetTop + boundingBox.y - for(s of strokes) { - const firstPointer = s.pointers[0] - let oldTimestamp = firstPointer.t - await page.mouse.move(offsetX + firstPointer.x, offsetY + firstPointer.y) - await page.mouse.down() - for(p of s.pointers) { - let waitTime = 0 - waitTime = p.t - oldTimestamp - oldTimestamp = p.t - await page.waitForTimeout(waitTime) - await page.mouse.move(offsetX + p.x, offsetY + p.y) - } - await page.mouse.up() - await page.waitForTimeout(100) - } -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getEditor = async (page) => { - return page.evaluate('editor') -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getEditorConfiguration = async (page) => { - return page.evaluate('editor.configuration') -} - -/** - * @param {Page} page - Playwright Page - * @param {Configuration} configuration - Editor configuration - * @returns Promise - */ -module.exports.setEditorConfiguration = async (page, configuration) => { - return page.evaluate(`editor.configuration = ${JSON.stringify(configuration)};`) -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getEditorModelExports = async (page) => { - return page.evaluate('editor.model.exports') -} -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getEditorModelConverts = async (page) => { - return page.evaluate('editor.model.converts') -} -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getEditorModelExportsType = async (page, type) => { - return page.evaluate(`editor.model.exports['${type}']`) -} - -const exported = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('exported', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getExportedDatas = async (page) => { - return page.evaluate(exported) -} - -const imported = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('imported', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getImportedDatas = async (page) => { - return page.evaluate(imported) -} - -const converted = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('converted', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getConvertedDatas = async (page) => { - return page.evaluate(converted) -} - - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.waitEditorIdle = async (page) => { - return page.evaluate("editor.waitForIdle()") -} - -const loaded = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('loaded', (e) => { - resolve(); - }); - }); -})()` -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.waitEditorLoaded = async (page) => { - return page.evaluate(loaded) -} - -module.exports.waitForEditorRest = async (page) => { - await Promise.all([ - page.waitForSelector('#ms-rendering-canvas'), - page.waitForSelector('#ms-capture-canvas'), - ]) - return page.evaluate('editor.initializationPromise') -} - -module.exports.waitForEditorWebSocket = async (page) => { - await Promise.all([ - page.waitForSelector('svg[data-layer="CAPTURE"]'), - page.waitForSelector('svg[data-layer="MODEL"]'), - ]) - return page.evaluate('editor.initializationPromise') -} - -function findValuesByKey (obj, key, list = []) { - if (!obj) return list - if (obj instanceof Array) { - Object.keys(obj).forEach((k) => { - list = list.concat(findValuesByKey(obj[k], key, [])) - }) - return list - } - if (obj[key]) { - if (obj[key] instanceof Array) { - Object.keys(obj[key]).forEach((l) => { - list.push(obj[key][l]) - }) - } else { - list.push(obj[key]) - } - } - - if (typeof obj === 'object') { - const children = Object.keys(obj) - if (children.length > 0) { - children.forEach((child) => { - list = list.concat(findValuesByKey(obj[child], key, [])) - }) - } - } - return list -} -module.exports.findValuesByKey = findValuesByKey - -module.exports.haveSameLabels = (jiix1, jiix2) => { - const labels1 = findValuesByKey(jiix1, 'label') - const labels2 = findValuesByKey(jiix2, 'label') - return JSON.stringify(labels1) === JSON.stringify(labels2) -} diff --git a/test/integration/jest.setup.js b/test/integration/jest.setup.js deleted file mode 100644 index 90ce0da3..00000000 --- a/test/integration/jest.setup.js +++ /dev/null @@ -1,6 +0,0 @@ -jest.retryTimes(1) -jest.setTimeout(30 * 1000) - -afterAll(() => { - browser.close() -}) diff --git a/test/integration/strokes/CustomLexicon/claclacla.json b/test/integration/strokes/CustomLexicon/claclacla.json deleted file mode 100644 index 3af61016..00000000 --- a/test/integration/strokes/CustomLexicon/claclacla.json +++ /dev/null @@ -1,116 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 727, 724, 720, 717, 714, 713, 713, 717, 728, 733, 740, 744, 756, 763, 782, - 787, 790, 790, 790, 790, 786, 783, 780, 779, 779, 779, 780, 781, 784, 786, - 795, 799, 802, 806, 811, 814, 820, 826, 823, 817, 810, 805, 804, 804, 806, - 818, 822, 825, 825, 825, 827, 830, 836, 840, 842 - ], - "y": [ - 438, 438, 440, 442, 448, 452, 455, 458, 464, 465, 465, 465, 462, 457, 439, - 433, 426, 417, 407, 402, 400, 400, 405, 413, 420, 427, 431, 441, 448, 458, - 473, 476, 477, 477, 477, 475, 469, 454, 453, 453, 453, 454, 459, 466, 471, - 472, 472, 466, 460, 457, 461, 469, 472, 473, 468 - ], - "t": [ - 1689674085085, 1689674085158, 1689674085191, 1689674085209, 1689674085229, - 1689674085253, 1689674085276, 1689674085298, 1689674085324, 1689674085345, - 1689674085368, 1689674085389, 1689674085433, 1689674085445, 1689674085490, - 1689674085511, 1689674085526, 1689674085545, 1689674085566, 1689674085593, - 1689674085640, 1689674085681, 1689674085727, 1689674085746, 1689674085768, - 1689674085795, 1689674085808, 1689674085832, 1689674085856, 1689674085879, - 1689674085897, 1689674085922, 1689674085940, 1689674085962, 1689674086006, - 1689674086027, 1689674086047, 1689674086090, 1689674086130, 1689674086174, - 1689674086196, 1689674086241, 1689674086279, 1689674086316, 1689674086352, - 1689674086393, 1689674086414, 1689674086480, 1689674086503, 1689674086543, - 1689674086619, 1689674086659, 1689674086699, 1689674086736, 1689674086787 - ], - "p": [ - 0.5, 0.83, 0.73, 0.7, 0.78, 0.72, 0.68, 0.74, 0.65, 0.75, 0.78, 0.71, - 0.65, 0.81, 0.49, 0.8, 0.79, 0.81, 0.68, 0.74, 0.73, 0.68, 0.76, 0.8, - 0.78, 0.78, 0.72, 0.68, 0.79, 0.68, 0.58, 0.74, 0.68, 0.71, 0.74, 0.7, - 0.81, 0.6, 0.68, 0.77, 0.78, 0.75, 0.75, 0.78, 0.75, 0.65, 0.71, 0.78, - 0.77, 0.68, 0.73, 0.81, 0.78, 0.72, 0.75 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 859, 855, 850, 848, 848, 852, 855, 858, 861, 864, 867, 873, 888, 899, 902, - 907, 910, 911, 911, 910, 907, 904, 899, 898, 898, 898, 898, 900, 903, 907, - 909, 913, 917, 921, 926, 929, 929, 925, 921, 918, 916, 916, 919, 926, 930, - 932, 935, 935, 935, 935, 935, 938, 942, 945 - ], - "y": [ - 448, 449, 454, 458, 463, 464, 464, 464, 464, 463, 463, 461, 455, 450, 447, - 439, 432, 408, 405, 399, 398, 398, 403, 412, 422, 433, 441, 446, 449, 456, - 459, 461, 462, 461, 456, 443, 440, 438, 438, 439, 445, 449, 455, 457, 457, - 452, 447, 441, 445, 453, 460, 464, 466, 465 - ], - "t": [ - 1689674087147, 1689674087243, 1689674087277, 1689674087309, 1689674087356, - 1689674087374, 1689674087396, 1689674087415, 1689674087440, 1689674087459, - 1689674087480, 1689674087499, 1689674087525, 1689674087545, 1689674087565, - 1689674087587, 1689674087609, 1689674087646, 1689674087661, 1689674087692, - 1689674087737, 1689674087799, 1689674087831, 1689674087855, 1689674087878, - 1689674087897, 1689674087920, 1689674087939, 1689674087949, 1689674087979, - 1689674087994, 1689674088018, 1689674088055, 1689674088092, 1689674088114, - 1689674088158, 1689674088178, 1689674088221, 1689674088257, 1689674088287, - 1689674088325, 1689674088347, 1689674088392, 1689674088434, 1689674088469, - 1689674088548, 1689674088567, 1689674088592, 1689674088675, 1689674088707, - 1689674088725, 1689674088746, 1689674088790, 1689674088851 - ], - "p": [ - 0.5, 0.8, 0.79, 0.73, 0.74, 0.72, 0.68, 0.68, 0.68, 0.68, 0.68, 0.77, 0.6, - 0.65, 0.72, 0.82, 0.79, 0.51, 0.68, 0.77, 0.68, 0.68, 0.79, 0.81, 0.68, - 0.67, 0.8, 0.75, 0.72, 0.8, 0.7, 0.73, 0.72, 0.72, 0.79, 0.63, 0.68, 0.73, - 0.71, 0.68, 0.77, 0.71, 0.78, 0.79, 0.71, 0.75, 0.76, 0.77, 0.71, 0.8, - 0.78, 0.74, 0.73, 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 969, 964, 960, 951, 951, 952, 957, 961, 966, 974, 981, 987, 992, 997, - 1007, 1010, 1012, 1012, 1012, 1011, 1008, 1005, 1001, 997, 996, 995, 996, - 996, 996, 1001, 1003, 1012, 1022, 1027, 1034, 1038, 1048, 1059, 1061, - 1061, 1058, 1055, 1047, 1042, 1038, 1036, 1036, 1038, 1044, 1048, 1054, - 1058, 1058, 1058, 1058, 1059, 1066, 1069, 1075, 1082, 1091, 1100, 1110, - 1118, 1123 - ], - "y": [ - 447, 447, 450, 460, 463, 469, 470, 470, 470, 470, 469, 468, 467, 461, 440, - 423, 411, 402, 397, 394, 392, 393, 397, 402, 413, 421, 432, 438, 450, 460, - 466, 469, 469, 469, 471, 471, 471, 466, 455, 448, 446, 447, 449, 453, 456, - 459, 462, 465, 467, 465, 459, 453, 450, 454, 457, 462, 469, 471, 473, 476, - 476, 477, 477, 477, 477 - ], - "t": [ - 1689674089210, 1689674089261, 1689674089295, 1689674089333, 1689674089355, - 1689674089374, 1689674089414, 1689674089435, 1689674089455, 1689674089475, - 1689674089494, 1689674089515, 1689674089531, 1689674089551, 1689674089575, - 1689674089597, 1689674089615, 1689674089644, 1689674089659, 1689674089694, - 1689674089735, 1689674089777, 1689674089798, 1689674089816, 1689674089840, - 1689674089859, 1689674089879, 1689674089898, 1689674089918, 1689674089942, - 1689674089961, 1689674090001, 1689674090044, 1689674090061, 1689674090083, - 1689674090104, 1689674090143, 1689674090192, 1689674090222, 1689674090250, - 1689674090296, 1689674090314, 1689674090335, 1689674090359, 1689674090379, - 1689674090400, 1689674090419, 1689674090440, 1689674090482, 1689674090523, - 1689674090546, 1689674090582, 1689674090602, 1689674090729, 1689674090746, - 1689674090763, 1689674090779, 1689674090796, 1689674090832, 1689674090851, - 1689674090875, 1689674090893, 1689674090913, 1689674090934, 1689674090953 - ], - "p": [ - 0.5, 0.78, 0.74, 0.63, 0.68, 0.77, 0.75, 0.71, 0.74, 0.8, 0.79, 0.77, - 0.75, 0.8, 0.52, 0.58, 0.65, 0.81, 0.74, 0.68, 0.7, 0.68, 0.76, 0.77, - 0.67, 0.8, 0.67, 0.77, 0.65, 0.67, 0.77, 0.82, 0.68, 0.74, 0.79, 0.71, - 0.68, 0.65, 0.67, 0.78, 0.7, 0.68, 0.8, 0.77, 0.74, 0.7, 0.68, 0.7, 0.77, - 0.73, 0.81, 0.79, 0.68, 0.71, 0.68, 0.75, 0.82, 0.7, 0.77, 0.79, 0.81, - 0.81, 0.68, 0.8, 0.74 - ] - } -] diff --git a/test/integration/strokes/CustomLexicon/jilop.json b/test/integration/strokes/CustomLexicon/jilop.json deleted file mode 100644 index fecbeb91..00000000 --- a/test/integration/strokes/CustomLexicon/jilop.json +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "x": [ - 645, 648, 651, 655, 657, 659, 660, 662, 663, 664, 667, 668, 670, 671, 672, - 671, 671, 671, 671, 671, 672, 674, 674, 675, 675, 676, 677, 677, 678, 679, - 679, 679, 679, 678, 677, 677, 676, 675, 673, 668, 663, 660, 656, 654, 653, - 652, 652, 653, 656, 658, 661, 663, 666, 668, 674, 678, 683, 686, 691, 694, - 697, 700, 703, 704, 705, 706, 706, 706, 706, 704, 703, 703, 704, 707, 707, - 708, 710, 712, 715, 718, 721, 725, 729, 737, 743, 747, 751, 755, 759, 760, - 763, 764, 766, 766, 767, 767, 766, 765, 764, 763, 761, 759, 755, 752, 748, - 745, 744, 742, 742, 741, 740, 740, 740, 740, 740, 740, 741, 742, 744, 746, - 749, 753, 759, 763, 766, 772, 777, 781, 785, 789, 793, 799, 803, 806, 808, - 809, 808, 804, 801, 797, 794, 790, 784, 780, 778, 778, 778, 779, 782, 786, - 794, 799, 803, 806, 810, 815, 818, 821, 822, 823, 823, 822, 819, 816, 812, - 808, 802, 798, 797, 797, 800, 803, 807, 814, 820, 825, 832, 837, 845, 849, - 852, 855, 858, 859, 856, 855, 854, 852, 852, 850, 849, 849, 848, 847, 846, - 845, 845, 846, 847, 847, 848, 849, 849, 850, 850, 851, 851, 851, 851, 851, - 852, 852, 852, 852, 857, 863, 867, 871, 875, 878, 879, 882, 887, 892, 894 - ], - "y": [ - 436, 436, 434, 430, 427, 423, 419, 414, 411, 408, 405, 401, 397, 394, 391, - 395, 400, 403, 408, 412, 416, 419, 423, 426, 430, 435, 442, 446, 449, 452, - 458, 462, 466, 470, 478, 483, 486, 489, 492, 494, 496, 496, 493, 487, 483, - 478, 474, 469, 465, 461, 458, 454, 451, 447, 442, 440, 436, 435, 431, 430, - 426, 423, 418, 414, 411, 408, 405, 402, 399, 404, 409, 412, 415, 421, 424, - 427, 431, 434, 434, 434, 435, 434, 432, 427, 422, 417, 412, 408, 400, 394, - 389, 385, 377, 372, 367, 363, 357, 354, 350, 346, 343, 340, 340, 343, 347, - 351, 355, 362, 367, 372, 378, 382, 386, 389, 392, 395, 400, 404, 407, 411, - 415, 418, 421, 422, 423, 424, 424, 424, 423, 422, 420, 415, 410, 406, 401, - 398, 395, 391, 389, 389, 391, 395, 404, 409, 413, 418, 422, 427, 430, 432, - 435, 436, 436, 435, 432, 427, 423, 418, 413, 410, 405, 401, 398, 396, 394, - 392, 394, 399, 402, 407, 409, 412, 414, 416, 416, 417, 416, 415, 411, 409, - 406, 402, 397, 394, 398, 407, 414, 421, 428, 438, 444, 450, 456, 461, 468, - 471, 474, 469, 465, 460, 451, 444, 439, 434, 430, 423, 418, 415, 411, 405, - 400, 397, 394, 390, 389, 391, 393, 395, 399, 404, 408, 410, 411, 409, 405 - ] - }, - { - "x": [704, 706, 706], - "y": [375, 372, 375] - }, - { - "x": [669, 669, 672, 675, 671, 668], - "y": [380, 377, 379, 379, 376, 375] - } -] diff --git a/test/integration/strokes/CustomLexicon/klopmo.json b/test/integration/strokes/CustomLexicon/klopmo.json deleted file mode 100644 index e12d45ee..00000000 --- a/test/integration/strokes/CustomLexicon/klopmo.json +++ /dev/null @@ -1,127 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 550, 553, 558, 564, 576, 583, 594, 599, 601, 604, 603, 601, 599, 596, 591, - 585, 583, 581, 578, 575, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, - 574, 574, 574, 577, 577, 577, 578, 578, 578, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 581, 583, 586, 589, 593, 597, 605, 610, 613, 616, - 616, 616, 613, 609, 605, 601, 598, 593, 587, 584, 584, 583, 583, 586, 590, - 596, 599, 606, 611, 616, 621, 625, 629, 634, 638, 643, 646, 650, 655, 660, - 671, 672, 674, 674, 674, 674, 674, 670, 667, 663, 661, 658, 655, 653, 653, - 653, 656, 659, 663, 670, 676, 679, 685, 689, 694, 698, 702, 706, 716, 722, - 727, 729, 729, 728, 724, 720, 717, 711, 708, 708, 708, 709, 716, 721, 729, - 734, 740, 745, 749, 753, 754, 754, 754, 752, 747, 740, 737, 732, 723, 719, - 718, 728, 736, 745, 750, 756, 761, 768, 774, 781, 790, 795, 795, 794, 794, - 794, 795, 798, 798, 801, 804, 805, 805, 805, 805, 804, 802, 799, 798, 796, - 796, 795, 795, 795, 795, 801, 805, 811, 820, 830, 838, 842, 844, 846, 848, - 851, 852, 854, 854, 854, 854, 860, 867, 873, 880, 884, 885, 886, 885, 885, - 888, 892, 896, 899, 900, 906, 911, 917, 918, 918, 918, 924, 932, 935, 937, - 941, 949, 957, 962, 969, 972, 977, 989, 996, 1004, 1006, 1006, 1004, 1000, - 984, 979, 976, 974, 973, 974, 985, 992, 1001, 1005, 1022, 1033, 1037, - 1039, 1039, 1033, 1026, 1017, 1012, 1007, 1006, 1009, 1017, 1028, 1043, - 1060, 1078, 1086, 1090 - ], - "y": [ - 413, 411, 409, 406, 399, 393, 378, 365, 355, 337, 330, 322, 318, 316, 316, - 324, 327, 332, 342, 349, 357, 364, 368, 375, 381, 389, 392, 398, 405, 408, - 414, 419, 422, 424, 427, 430, 433, 436, 439, 442, 445, 448, 443, 437, 431, - 424, 421, 416, 411, 408, 404, 401, 397, 396, 396, 396, 399, 403, 406, 410, - 414, 417, 419, 422, 425, 426, 427, 427, 423, 421, 418, 415, 411, 411, 411, - 411, 412, 418, 425, 429, 434, 437, 440, 441, 442, 442, 442, 442, 442, 438, - 422, 414, 403, 393, 381, 375, 365, 361, 356, 354, 351, 351, 351, 358, 364, - 374, 381, 393, 402, 416, 425, 430, 438, 441, 443, 447, 449, 449, 437, 428, - 419, 414, 411, 408, 408, 408, 409, 415, 420, 423, 426, 429, 431, 433, 434, - 435, 437, 438, 438, 438, 433, 428, 422, 414, 408, 404, 403, 401, 400, 400, - 404, 412, 417, 420, 421, 422, 422, 422, 421, 416, 406, 402, 394, 398, 406, - 412, 420, 433, 444, 455, 467, 470, 475, 478, 475, 456, 447, 437, 424, 417, - 407, 394, 390, 387, 376, 374, 376, 379, 387, 397, 404, 411, 416, 420, 423, - 419, 405, 392, 383, 380, 377, 380, 387, 394, 410, 421, 424, 427, 421, 411, - 400, 395, 391, 390, 393, 404, 415, 424, 431, 426, 418, 404, 401, 401, 406, - 413, 421, 428, 432, 433, 433, 433, 431, 425, 417, 411, 404, 398, 396, 391, - 391, 392, 397, 405, 418, 430, 434, 438, 438, 438, 431, 427, 421, 412, 404, - 400, 396, 396, 398, 402, 402, 402, 402, 398, 393, 381, 375, 371 - ], - "t": [ - 1689076184153, 1689076184227, 1689076184259, 1689076184276, 1689076184292, - 1689076184308, 1689076184324, 1689076184340, 1689076184356, 1689076184373, - 1689076184389, 1689076184405, 1689076184421, 1689076184474, 1689076184518, - 1689076184535, 1689076184551, 1689076184567, 1689076184584, 1689076184600, - 1689076184616, 1689076184632, 1689076184649, 1689076184665, 1689076184681, - 1689076184697, 1689076184714, 1689076184730, 1689076184747, 1689076184762, - 1689076184779, 1689076184811, 1689076184827, 1689076184876, 1689076184908, - 1689076185135, 1689076185201, 1689076185218, 1689076185235, 1689076185267, - 1689076185300, 1689076185315, 1689076185496, 1689076185512, 1689076185528, - 1689076185544, 1689076185561, 1689076185577, 1689076185593, 1689076185608, - 1689076185625, 1689076185641, 1689076185690, 1689076185723, 1689076185754, - 1689076185799, 1689076185814, 1689076185831, 1689076185848, 1689076185864, - 1689076185879, 1689076185896, 1689076185929, 1689076185961, 1689076185993, - 1689076186009, 1689076186026, 1689076186041, 1689076186057, 1689076186074, - 1689076186090, 1689076186122, 1689076186139, 1689076186155, 1689076186187, - 1689076186219, 1689076186236, 1689076186252, 1689076186268, 1689076186285, - 1689076186300, 1689076186317, 1689076186333, 1689076186350, 1689076186365, - 1689076186381, 1689076186398, 1689076186414, 1689076186430, 1689076186446, - 1689076186463, 1689076186479, 1689076186495, 1689076186511, 1689076186527, - 1689076186544, 1689076186560, 1689076186575, 1689076186592, 1689076186608, - 1689076186625, 1689076186673, 1689076186722, 1689076186754, 1689076186771, - 1689076186787, 1689076186803, 1689076186819, 1689076186836, 1689076186853, - 1689076186868, 1689076186885, 1689076186901, 1689076186917, 1689076186933, - 1689076186950, 1689076186982, 1689076187015, 1689076187047, 1689076187064, - 1689076187079, 1689076187096, 1689076187112, 1689076187128, 1689076187144, - 1689076187177, 1689076187210, 1689076187243, 1689076187259, 1689076187276, - 1689076187292, 1689076187308, 1689076187325, 1689076187341, 1689076187357, - 1689076187373, 1689076187390, 1689076187406, 1689076187422, 1689076187437, - 1689076187471, 1689076187487, 1689076187503, 1689076187520, 1689076187535, - 1689076187551, 1689076187568, 1689076187584, 1689076187616, 1689076187664, - 1689076187697, 1689076187730, 1689076187746, 1689076187763, 1689076187779, - 1689076187795, 1689076187811, 1689076187828, 1689076187844, 1689076187860, - 1689076187876, 1689076187893, 1689076187910, 1689076188007, 1689076188023, - 1689076188039, 1689076188056, 1689076188072, 1689076188088, 1689076188104, - 1689076188121, 1689076188137, 1689076188153, 1689076188202, 1689076188268, - 1689076188285, 1689076188300, 1689076188317, 1689076188334, 1689076188349, - 1689076188366, 1689076188384, 1689076188399, 1689076188414, 1689076188431, - 1689076188512, 1689076188529, 1689076188545, 1689076188561, 1689076188577, - 1689076188594, 1689076188610, 1689076188626, 1689076188642, 1689076188675, - 1689076188756, 1689076188771, 1689076188788, 1689076188804, 1689076188820, - 1689076188836, 1689076188919, 1689076188934, 1689076188950, 1689076188967, - 1689076188983, 1689076188999, 1689076189015, 1689076189081, 1689076189098, - 1689076189114, 1689076189130, 1689076189146, 1689076189195, 1689076189210, - 1689076189227, 1689076189243, 1689076189260, 1689076189275, 1689076189340, - 1689076189356, 1689076189372, 1689076189389, 1689076189421, 1689076189453, - 1689076189469, 1689076189486, 1689076189501, 1689076189518, 1689076189534, - 1689076189551, 1689076189566, 1689076189582, 1689076189599, 1689076189615, - 1689076189631, 1689076189647, 1689076189663, 1689076189680, 1689076189697, - 1689076189713, 1689076189728, 1689076189745, 1689076189761, 1689076189777, - 1689076189793, 1689076189809, 1689076189826, 1689076189842, 1689076189858, - 1689076189874, 1689076189890, 1689076189907, 1689076189923, 1689076189939, - 1689076189955, 1689076189972, 1689076189988, 1689076190021, 1689076190052, - 1689076190085, 1689076190117, 1689076190134, 1689076190150, 1689076190166, - 1689076190182, 1689076190198, 1689076190214 - ], - "p": [ - 0.5, 0.81, 0.75, 0.78, 0.63, 0.81, 0.57, 0.63, 0.68, 0.57, 0.79, 0.8, - 0.73, 0.7, 0.74, 0.68, 0.7, 0.75, 0.68, 0.79, 0.8, 0.78, 0.71, 0.78, 0.77, - 0.8, 0.68, 0.77, 0.78, 0.68, 0.77, 0.74, 0.68, 0.7, 0.68, 0.68, 0.68, - 0.68, 0.68, 0.7, 0.68, 0.68, 0.74, 0.77, 0.77, 0.78, 0.68, 0.74, 0.74, - 0.68, 0.72, 0.7, 0.74, 0.68, 0.71, 0.71, 0.81, 0.77, 0.72, 0.74, 0.71, - 0.68, 0.7, 0.74, 0.74, 0.72, 0.68, 0.74, 0.79, 0.7, 0.68, 0.68, 0.71, - 0.68, 0.71, 0.77, 0.68, 0.81, 0.81, 0.77, 0.79, 0.74, 0.74, 0.75, 0.72, - 0.74, 0.68, 0.71, 0.74, 0.77, 0.56, 0.8, 0.67, 0.68, 0.65, 0.77, 0.68, - 0.76, 0.76, 0.73, 0.7, 0.68, 0.68, 0.79, 0.77, 0.68, 0.79, 0.65, 0.82, - 0.6, 0.67, 0.76, 0.68, 0.74, 0.75, 0.76, 0.73, 0.71, 0.6, 0.67, 0.68, - 0.75, 0.68, 0.68, 0.71, 0.71, 0.68, 0.81, 0.76, 0.68, 0.68, 0.68, 0.79, - 0.75, 0.8, 0.75, 0.77, 0.75, 0.71, 0.71, 0.75, 0.74, 0.77, 0.8, 0.8, 0.8, - 0.68, 0.75, 0.81, 0.71, 0.72, 0.64, 0.82, 0.82, 0.75, 0.77, 0.74, 0.78, - 0.77, 0.81, 0.63, 0.77, 0.8, 0.72, 0.8, 0.77, 0.8, 0.63, 0.67, 0.66, 0.65, - 0.68, 0.74, 0.68, 0.68, 0.56, 0.81, 0.68, 0.64, 0.79, 0.68, 0.64, 0.71, - 0.68, 0.67, 0.77, 0.73, 0.78, 0.65, 0.62, 0.67, 0.8, 0.75, 0.73, 0.7, - 0.74, 0.63, 0.64, 0.81, 0.68, 0.68, 0.78, 0.82, 0.81, 0.58, 0.66, 0.68, - 0.68, 0.77, 0.68, 0.66, 0.77, 0.76, 0.68, 0.68, 0.65, 0.65, 0.67, 0.79, - 0.74, 0.8, 0.61, 0.81, 0.68, 0.75, 0.8, 0.66, 0.67, 0.77, 0.79, 0.68, - 0.74, 0.65, 0.81, 0.66, 0.77, 0.78, 0.77, 0.73, 0.59, 0.74, 0.68, 0.75, - 0.8, 0.64, 0.6, 0.8, 0.82, 0.71, 0.59, 0.64, 0.76, 0.77, 0.81, 0.68, 0.8, - 0.82, 0.74, 0.75, 0.72, 0.68, 0.8, 0.67, 0.61, 0.58, 0.53, 0.68, 0.76 - ] - } -] diff --git a/test/integration/strokes/Interact/aires.json b/test/integration/strokes/Interact/aires.json deleted file mode 100644 index cb5888c8..00000000 --- a/test/integration/strokes/Interact/aires.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "x": [ - 833, 830, 827, 821, 818, 809, 807, 804, 804, 804, 807, 811, 814, 817, 820, - 825, 830, 834, 836, 836, 836, 834, 834, 834, 835, 838, 842, 846, 851, 856, - 859, 862, 862, 862, 862, 862, 862, 862, 862, 862, 865, 871, 874, 878, 886, - 893, 894, 895, 895, 895, 894, 899, 904, 908, 911, 915, 914, 911, 908, 907, - 907, 912, 915, 922, 928, 935, 941, 947, 953, 956, 959, 963, 965, 961, 953, - 947, 942, 937, 936, 941, 944, 949, 956, 962, 973, 983, 986, 988, 991, 991, - 994, 992, 993, 995, 996, 997, 994, 988, 985, 982, 975, 972 - ], - "y": [ - 385, 385, 385, 385, 385, 387, 390, 395, 399, 404, 406, 407, 408, 408, 407, - 404, 399, 396, 392, 388, 384, 389, 393, 400, 403, 407, 407, 408, 408, 405, - 403, 396, 390, 385, 382, 386, 389, 395, 403, 410, 411, 411, 411, 410, 406, - 399, 396, 392, 387, 384, 381, 380, 381, 382, 384, 386, 389, 393, 396, 399, - 403, 406, 406, 407, 407, 407, 407, 407, 406, 405, 402, 398, 391, 389, 389, - 389, 389, 391, 395, 399, 400, 401, 401, 403, 403, 403, 402, 399, 394, 390, - 388, 391, 395, 401, 405, 408, 411, 411, 411, 410, 407, 406 - ] - }, - { - "x": [863], - "y": [367] - } - ] \ No newline at end of file diff --git a/test/integration/strokes/Interact/buenos.json b/test/integration/strokes/Interact/buenos.json deleted file mode 100644 index 6fd70abf..00000000 --- a/test/integration/strokes/Interact/buenos.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "x": [ - 419, 424, 427, 437, 454, 463, 478, 490, 494, 495, 497, 497, 496, 494, 491, - 488, 479, 474, 469, 464, 460, 455, 452, 450, 450, 450, 450, 450, 452, 454, - 460, 462, 465, 468, 471, 475, 478, 481, 484, 489, 491, 492, 492, 489, 486, - 486, 489, 493, 496, 500, 503, 508, 512, 515, 518, 520, 519, 518, 518, 518, - 520, 523, 527, 531, 535, 539, 542, 547, 549, 551, 552, 553, 552, 552, 552, - 552, 552, 555, 558, 561, 567, 571, 577, 585, 588, 591, 591, 590, 588, 585, - 582, 580, 579, 580, 584, 588, 591, 595, 601, 607, 613, 618, 622, 625, 627, - 631, 632, 634, 634, 636, 639, 641, 645, 646, 648, 652, 655, 659, 660, 663, - 666, 669, 677, 681, 686, 690, 694, 697, 698, 698, 698, 697, 694, 690, 687, - 682, 679, 670, 670, 670, 674, 677, 680, 683, 689, 695, 698, 701, 703, 706, - 706, 706, 706, 702, 699, 693, 690, 693, 696, 703, 710, 717, 721, 726, 727, - 727, 727, 728, 729, 732, 739, 740, 741, 742, 741, 738, 734, 729 - ], - "y": [ - 392, 390, 389, 388, 380, 375, 362, 348, 341, 333, 320, 315, 312, 309, 308, - 309, 312, 316, 321, 327, 330, 337, 343, 348, 354, 363, 371, 374, 380, 384, - 390, 393, 395, 397, 399, 401, 401, 401, 399, 394, 390, 385, 381, 379, 380, - 383, 386, 386, 386, 385, 385, 383, 381, 380, 377, 372, 376, 379, 386, 390, - 394, 396, 399, 400, 400, 399, 395, 389, 386, 383, 380, 375, 378, 382, 390, - 398, 402, 405, 406, 407, 406, 404, 401, 395, 392, 388, 385, 381, 378, 376, - 377, 381, 390, 393, 400, 401, 402, 402, 402, 397, 389, 384, 378, 377, 381, - 385, 390, 393, 396, 399, 396, 392, 387, 384, 381, 384, 390, 395, 398, 401, - 404, 405, 405, 405, 405, 404, 402, 399, 394, 391, 388, 385, 383, 383, 383, - 386, 388, 396, 399, 403, 407, 410, 412, 413, 413, 413, 412, 411, 408, 405, - 400, 396, 392, 387, 386, 387, 390, 390, 390, 390, 390, 390, 390, 388, 384, - 380, 383, 386, 389, 394, 403, 406, 409, 414, 418, 419, 419, 416 - ] - } - ] \ No newline at end of file diff --git a/test/integration/strokes/Interact/buenosAires.json b/test/integration/strokes/Interact/buenosAires.json deleted file mode 100644 index e1ef2182..00000000 --- a/test/integration/strokes/Interact/buenosAires.json +++ /dev/null @@ -1,998 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 480, - 480, - 484, - 487, - 493, - 497, - 499, - 501, - 503, - 504, - 505, - 506, - 506, - 506, - 507, - 507, - 508, - 508, - 508, - 508, - 508, - 508, - 509, - 510, - 511, - 508, - 505, - 504, - 502, - 501, - 500, - 500, - 502, - 504, - 508, - 514, - 518, - 522, - 530, - 535, - 540, - 545, - 550, - 552, - 553, - 551, - 547, - 533, - 522, - 514, - 510, - 524 - ], - "y": [ - 200, - 197, - 203, - 211, - 227, - 240, - 251, - 261, - 272, - 277, - 282, - 286, - 290, - 294, - 297, - 301, - 305, - 308, - 311, - 314, - 319, - 324, - 331, - 336, - 339, - 332, - 327, - 323, - 320, - 314, - 311, - 308, - 304, - 300, - 295, - 289, - 287, - 287, - 289, - 292, - 296, - 301, - 307, - 313, - 322, - 328, - 332, - 340, - 344, - 346, - 347, - 342 - ], - "t": [ - 1691514736507, - 1691514736563, - 1691514736662, - 1691514736680, - 1691514736695, - 1691514736713, - 1691514736729, - 1691514736746, - 1691514736762, - 1691514736779, - 1691514736796, - 1691514736812, - 1691514736829, - 1691514736846, - 1691514736862, - 1691514736879, - 1691514736896, - 1691514736912, - 1691514736979, - 1691514737045, - 1691514737063, - 1691514737129, - 1691514737146, - 1691514737162, - 1691514737212, - 1691514737296, - 1691514737312, - 1691514737330, - 1691514737346, - 1691514737363, - 1691514737379, - 1691514737396, - 1691514737412, - 1691514737429, - 1691514737445, - 1691514737462, - 1691514737479, - 1691514737496, - 1691514737512, - 1691514737529, - 1691514737546, - 1691514737562, - 1691514737579, - 1691514737596, - 1691514737612, - 1691514737629, - 1691514737646, - 1691514737663, - 1691514737679, - 1691514737696, - 1691514737712, - 1691514737754 - ], - "p": [ - 0.5, - 0.83, - 0.79, - 0.81, - 0.59, - 0.63, - 0.67, - 0.68, - 0.67, - 0.75, - 0.75, - 0.72, - 0.71, - 0.71, - 0.68, - 0.71, - 0.72, - 0.68, - 0.68, - 0.68, - 0.74, - 0.74, - 0.79, - 0.75, - 0.68, - 0.79, - 0.76, - 0.72, - 0.7, - 0.77, - 0.68, - 0.68, - 0.73, - 0.73, - 0.77, - 0.81, - 0.73, - 0.71, - 0.8, - 0.76, - 0.77, - 0.79, - 0.8, - 0.77, - 0.81, - 0.77, - 0.76, - 0.6, - 0.66, - 0.8, - 0.72, - 0.61 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 585, - 585, - 585, - 585, - 586, - 590, - 594, - 599, - 608, - 613, - 616, - 618, - 618, - 618, - 616, - 618, - 621, - 624, - 627, - 632, - 637, - 649 - ], - "y": [ - 307, - 310, - 315, - 324, - 330, - 335, - 338, - 339, - 337, - 331, - 323, - 315, - 306, - 303, - 310, - 324, - 334, - 343, - 350, - 354, - 353, - 346 - ], - "t": [ - 1691514737971, - 1691514738096, - 1691514738113, - 1691514738129, - 1691514738146, - 1691514738163, - 1691514738179, - 1691514738196, - 1691514738212, - 1691514738229, - 1691514738246, - 1691514738263, - 1691514738279, - 1691514738296, - 1691514738346, - 1691514738362, - 1691514738379, - 1691514738396, - 1691514738412, - 1691514738429, - 1691514738446, - 1691514738458 - ], - "p": [ - 0.5, - 0.83, - 0.74, - 0.81, - 0.77, - 0.77, - 0.74, - 0.75, - 0.81, - 0.8, - 0.81, - 0.8, - 0.81, - 0.68, - 0.79, - 0.62, - 0.68, - 0.82, - 0.79, - 0.77, - 0.75, - 0.63 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 673, - 670, - 673, - 680, - 688, - 699, - 703, - 705, - 699, - 688, - 680, - 674, - 671, - 673, - 680, - 692, - 706, - 726 - ], - "y": [ - 331, - 333, - 333, - 332, - 329, - 321, - 314, - 309, - 307, - 312, - 318, - 325, - 330, - 339, - 345, - 350, - 352, - 353 - ], - "t": [ - 1691514738544, - 1691514738596, - 1691514738612, - 1691514738629, - 1691514738646, - 1691514738662, - 1691514738679, - 1691514738696, - 1691514738729, - 1691514738745, - 1691514738762, - 1691514738779, - 1691514738795, - 1691514738812, - 1691514738829, - 1691514738846, - 1691514738862, - 1691514738872 - ], - "p": [ - 0.5, - 0.81, - 0.68, - 0.79, - 0.81, - 0.63, - 0.8, - 0.75, - 0.77, - 0.65, - 0.68, - 0.81, - 0.76, - 0.81, - 0.81, - 0.64, - 0.62, - 0.55 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 756, - 756, - 753, - 753, - 755, - 759, - 765, - 775, - 779, - 782, - 783, - 784, - 784, - 784, - 785, - 789, - 805 - ], - "y": [ - 351, - 355, - 343, - 335, - 326, - 318, - 313, - 309, - 309, - 312, - 318, - 329, - 336, - 342, - 346, - 348, - 345 - ], - "t": [ - 1691514739000, - 1691514739045, - 1691514739113, - 1691514739129, - 1691514739146, - 1691514739162, - 1691514739179, - 1691514739196, - 1691514739212, - 1691514739230, - 1691514739246, - 1691514739263, - 1691514739279, - 1691514739296, - 1691514739312, - 1691514739329, - 1691514739344 - ], - "p": [ - 0.5, - 0.8, - 0.58, - 0.8, - 0.81, - 0.81, - 0.8, - 0.67, - 0.71, - 0.72, - 0.77, - 0.67, - 0.78, - 0.77, - 0.72, - 0.73, - 0.6 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 824, - 820, - 818, - 821, - 829, - 841, - 854, - 870, - 876, - 876, - 873, - 867, - 859, - 847, - 842, - 845, - 848 - ], - "y": [ - 326, - 332, - 337, - 347, - 352, - 356, - 356, - 350, - 341, - 332, - 326, - 323, - 323, - 326, - 328, - 329, - 329 - ], - "t": [ - 1691514739413, - 1691514739463, - 1691514739479, - 1691514739496, - 1691514739512, - 1691514739529, - 1691514739545, - 1691514739563, - 1691514739579, - 1691514739595, - 1691514739612, - 1691514739629, - 1691514739646, - 1691514739662, - 1691514739679, - 1691514739695, - 1691514739702 - ], - "p": [ - 0.5, - 0.73, - 0.75, - 0.68, - 0.82, - 0.64, - 0.64, - 0.59, - 0.67, - 0.81, - 0.78, - 0.78, - 0.8, - 0.65, - 0.75, - 0.68, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 918, - 915, - 921, - 927, - 935, - 947, - 954, - 957, - 956, - 948, - 927, - 910, - 903 - ], - "y": [ - 301, - 300, - 307, - 312, - 317, - 327, - 335, - 343, - 349, - 354, - 361, - 364, - 365 - ], - "t": [ - 1691514739848, - 1691514739896, - 1691514739962, - 1691514739979, - 1691514739996, - 1691514740013, - 1691514740030, - 1691514740046, - 1691514740063, - 1691514740079, - 1691514740096, - 1691514740113, - 1691514740119 - ], - "p": [ - 0.5, - 0.82, - 0.81, - 0.8, - 0.82, - 0.6, - 0.67, - 0.81, - 0.77, - 0.82, - 0.53, - 0.58, - 0.79 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 1121, - 1117, - 1114, - 1112, - 1112, - 1116, - 1125, - 1136, - 1148, - 1161, - 1164, - 1164, - 1160, - 1149, - 1141, - 1132, - 1125, - 1118, - 1114 - ], - "y": [ - 300, - 300, - 304, - 308, - 316, - 322, - 327, - 329, - 329, - 322, - 315, - 307, - 301, - 297, - 295, - 296, - 300, - 304, - 307 - ], - "t": [ - 1691514741014, - 1691514741113, - 1691514741128, - 1691514741146, - 1691514741162, - 1691514741179, - 1691514741196, - 1691514741212, - 1691514741229, - 1691514741245, - 1691514741263, - 1691514741279, - 1691514741296, - 1691514741313, - 1691514741329, - 1691514741346, - 1691514741362, - 1691514741380, - 1691514741396 - ], - "p": [ - 0.5, - 0.8, - 0.74, - 0.73, - 0.8, - 0.79, - 0.68, - 0.67, - 0.65, - 0.62, - 0.79, - 0.8, - 0.79, - 0.66, - 0.8, - 0.81, - 0.8, - 0.8, - 0.74 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 1159, - 1155, - 1154, - 1155, - 1157, - 1158, - 1161, - 1164, - 1171 - ], - "y": [ - 292, - 296, - 299, - 305, - 312, - 320, - 327, - 332, - 333 - ], - "t": [ - 1691514741539, - 1691514741580, - 1691514741595, - 1691514741613, - 1691514741629, - 1691514741646, - 1691514741662, - 1691514741680, - 1691514741689 - ], - "p": [ - 0.5, - 0.76, - 0.68, - 0.77, - 0.79, - 0.8, - 0.79, - 0.76, - 0.79 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 1215, - 1216, - 1216, - 1218, - 1221, - 1222 - ], - "y": [ - 304, - 308, - 314, - 323, - 330, - 334 - ], - "t": [ - 1691514741823, - 1691514741845, - 1691514741862, - 1691514741879, - 1691514741896, - 1691514741912 - ], - "p": [ - 0.5, - 0.8, - 0.77, - 0.81, - 0.79, - 0.72 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 1214, - 1211, - 1208 - ], - "y": [ - 279, - 275, - 272 - ], - "t": [ - 1691514742011, - 1691514742046, - 1691514742063 - ], - "p": [ - 0.5, - 0.78, - 0.72 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 1273, - 1271, - 1265, - 1261, - 1259, - 1260, - 1265, - 1277 - ], - "y": [ - 330, - 326, - 318, - 312, - 305, - 294, - 286, - 279 - ], - "t": [ - 1691514742237, - 1691514742295, - 1691514742312, - 1691514742330, - 1691514742346, - 1691514742363, - 1691514742379, - 1691514742392 - ], - "p": [ - 0.5, - 0.79, - 0.63, - 0.79, - 0.79, - 0.67, - 0.82, - 0.63 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 1312, - 1318, - 1324, - 1331, - 1335, - 1336, - 1333, - 1329, - 1324, - 1323, - 1324, - 1329, - 1335, - 1348, - 1357, - 1363, - 1366, - 1367, - 1367, - 1373, - 1384, - 1403, - 1414, - 1421, - 1424, - 1416, - 1404, - 1386, - 1378 - ], - "y": [ - 300, - 302, - 302, - 300, - 297, - 291, - 288, - 289, - 294, - 300, - 307, - 313, - 317, - 319, - 315, - 306, - 294, - 278, - 273, - 274, - 281, - 296, - 307, - 318, - 326, - 335, - 340, - 343, - 343 - ], - "t": [ - 1691514742485, - 1691514742545, - 1691514742562, - 1691514742579, - 1691514742596, - 1691514742612, - 1691514742646, - 1691514742662, - 1691514742679, - 1691514742695, - 1691514742712, - 1691514742729, - 1691514742746, - 1691514742762, - 1691514742779, - 1691514742796, - 1691514742812, - 1691514742829, - 1691514742845, - 1691514742879, - 1691514742896, - 1691514742913, - 1691514742929, - 1691514742946, - 1691514742962, - 1691514742979, - 1691514742995, - 1691514743013, - 1691514743018 - ], - "p": [ - 0.5, - 0.75, - 0.77, - 0.79, - 0.74, - 0.77, - 0.72, - 0.72, - 0.79, - 0.77, - 0.79, - 0.8, - 0.79, - 0.64, - 0.82, - 0.67, - 0.65, - 0.6, - 0.74, - 0.77, - 0.64, - 0.51, - 0.61, - 0.64, - 0.81, - 0.65, - 0.64, - 0.57, - 0.8 - ] - } -] diff --git a/test/integration/strokes/Interact/madrid.json b/test/integration/strokes/Interact/madrid.json deleted file mode 100644 index a1102987..00000000 --- a/test/integration/strokes/Interact/madrid.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "x": [ - 360, 357, 354, 350, 348, 347, 350, 354, 361, 368, 376, 388, 395, 400, 404, - 408, 414, 418, 421, 425, 426, 427, 427, 427, 427, 429, 434, 438, 443, 448, - 453, 456, 459, 465, 468, 471, 474, 475, 475, 475, 475, 470, 468, 467, 468, - 470, 473, 480, 484, 487, 492, 495, 498, 501, 504, 509, 513, 516, 518, 519, - 521, 522, 524, 527, 534, 539, 544, 551, 559, 567, 573, 578, 580, 582, 584, - 584, 580, 576, 572, 567, 563, 556, 550, 544, 541, 537, 536, 536, 536, 536, - 539, 541, 544, 547, 553, 556, 561, 568, 571, 574, 577, 581, 583, 584, 585, - 584, 583, 582, 581, 582, 584, 586, 587, 589, 592, 595, 601, 607, 610, 615, - 620, 626, 634, 640, 646, 653, 656, 658, 659, 659, 656, 653, 648, 640, 635, - 630, 625, 621, 618, 613, 611, 610, 611, 614, 617, 620, 625, 629, 636, 641, - 645, 648, 651, 653, 656, 658, 660, 661, 662, 663, 664, 664, 664, 663, 663, - 662, 662, 661, 661, 661, 660, 659, 658, 658, 658, 658, 659, 661, 662, 664, - 666, 667, 670, 672, 675, 679, 686, 689, 692, 696, 698, 699, 700, 699, 695, - 701, 705, 709, 712, 714, 714, 714, 714, 716, 717, 720, 723, 728, 732, 735, - 737, 738, 739, 739, 740, 739, 739, 740, 739, 738, 737, 737, 737, 738, 740, - 743, 747, 751, 754, 758, 763, 768, 773, 777, 784, 788, 791, 792, 792, 787, - 782, 778, 771, 768, 764, 761, 760, 758, 758, 758, 759, 762, 767, 771, 775, - 778, 782, 787, 791, 794, 797, 799, 801, 802, 804, 806, 806, 806, 806, 805, - 804, 803, 803, 802, 802, 801, 802, 801, 799, 798, 798, 796, 796, 796, 798, - 798, 799, 799, 800, 801, 801, 801, 801, 801, 801, 802, 803, 803, 806, 810, - 814, 817, 821, 825, 829, 833, 836 - ], - "y": [ - 359, 359, 359, 355, 352, 348, 340, 336, 332, 329, 326, 324, 323, 323, 323, - 324, 327, 330, 334, 340, 345, 350, 354, 358, 354, 350, 342, 338, 335, 332, - 330, 329, 329, 331, 334, 337, 344, 349, 354, 359, 362, 358, 354, 350, 345, - 340, 337, 333, 331, 330, 330, 330, 330, 331, 333, 336, 340, 345, 349, 352, - 355, 358, 361, 364, 365, 366, 366, 366, 364, 361, 358, 354, 350, 344, 340, - 337, 333, 331, 330, 330, 330, 330, 332, 335, 338, 341, 344, 347, 351, 354, - 359, 362, 363, 364, 366, 366, 367, 366, 365, 362, 360, 355, 351, 348, 344, - 338, 335, 331, 336, 341, 345, 349, 353, 356, 360, 362, 364, 365, 366, 366, - 366, 365, 363, 361, 358, 352, 349, 345, 342, 338, 334, 332, 331, 331, 330, - 331, 331, 333, 336, 341, 344, 348, 354, 356, 357, 359, 360, 361, 361, 361, - 361, 360, 358, 354, 349, 343, 337, 330, 325, 320, 313, 308, 303, 299, 295, - 289, 286, 289, 294, 299, 304, 308, 315, 319, 323, 328, 332, 338, 342, 345, - 349, 352, 356, 359, 362, 362, 362, 360, 356, 352, 347, 341, 337, 334, 332, - 331, 331, 332, 332, 335, 339, 343, 346, 350, 353, 356, 356, 357, 356, 353, - 349, 346, 343, 340, 336, 333, 330, 326, 330, 335, 340, 344, 347, 350, 355, - 359, 361, 362, 362, 362, 360, 357, 355, 351, 346, 342, 339, 336, 333, 330, - 330, 329, 329, 330, 332, 336, 340, 346, 349, 352, 355, 359, 362, 364, 364, - 362, 358, 354, 349, 345, 341, 335, 331, 327, 322, 317, 313, 310, 307, 302, - 299, 296, 290, 286, 283, 279, 274, 271, 278, 282, 286, 290, 294, 300, 304, - 308, 312, 317, 321, 324, 327, 330, 334, 337, 340, 345, 348, 351, 354, 356, - 357, 357, 356, 353, 351, 348, 346 - ] - }, - { - "x": [750], - "y": [302] - } - ] \ No newline at end of file diff --git a/test/integration/strokes/Interact/paris.json b/test/integration/strokes/Interact/paris.json deleted file mode 100644 index ecf7357f..00000000 --- a/test/integration/strokes/Interact/paris.json +++ /dev/null @@ -1,24 +0,0 @@ -[ - { - "x": [ - 313, 317, 324, 333, 349, 358, 362, 364, 365, 365, 365, 366, 366, 367, 368, - 368, 368, 368, 368, 368, 368, 366, 365, 364, 363, 363, 364, 366, 368, 372, - 376, 381, 386, 389, 393, 396, 398, 400, 404, 408, 413, 419, 425, 429, 431, - 432, 424, 419, 416, 413, 411, 410, 411, 413, 420, 424, 427, 430, 432, 432, - 432, 432, 433, 436, 438, 441, 447, 450, 454, 457, 458, 459, 467, 475, 478, - 479, 477, 476, 475, 478, 481, 484, 489, 493, 495, 497, 497, 497, 497, 497, - 497, 498, 501, 506, 509, 513, 516, 517, 516, 518, 522, 525, 527, 524, 518, - 513, 506, 502 - ], - "y": [ - 383, 380, 377, 372, 361, 354, 349, 346, 342, 345, 348, 357, 363, 368, 373, - 383, 391, 398, 404, 408, 402, 397, 387, 381, 375, 370, 364, 361, 358, 356, - 353, 351, 351, 353, 357, 359, 364, 368, 368, 368, 366, 363, 358, 354, 350, - 346, 342, 342, 342, 345, 351, 360, 364, 367, 370, 371, 370, 367, 363, 356, - 352, 349, 357, 361, 364, 366, 366, 364, 360, 356, 350, 344, 343, 343, 344, - 348, 353, 356, 359, 361, 361, 358, 353, 348, 344, 341, 338, 341, 344, 349, - 355, 358, 359, 356, 352, 348, 344, 338, 342, 345, 351, 354, 357, 360, 361, - 361, 361, 359 - ] - } - ] \ No newline at end of file diff --git a/test/integration/strokes/Interact/rome.json b/test/integration/strokes/Interact/rome.json deleted file mode 100644 index 5594bed5..00000000 --- a/test/integration/strokes/Interact/rome.json +++ /dev/null @@ -1,40 +0,0 @@ -[ - { - "x": [ - 583, 586, 590, 597, 602, 608, 613, 618, 626, 629, 632, 633, 634, 632, 630, - 627, 625, 621, 618, 615, 611, 608, 607, 610, 613, 617, 621, 627, 632, 637, - 642, 648, 653, 656, 659, 666, 669, 673, 676, 679, 681, 682, 682, 682, 681, - 679, 677, 675, 674, 673, 673, 674, 676, 681, 684, 689, 692, 697, 702, 708, - 712, 716, 719, 725, 729, 732, 734, 736, 737, 738, 737, 735, 729, 725, 722, - 717, 714, 711, 709, 707, 705, 704, 704, 704, 704, 705, 707, 709, 712, 716, - 721, 724, 728, 732, 737, 741, 745, 750, 753, 754, 755, 754, 751, 747, 744, - 739, 735, 731, 727, 722, 719, 717, 717, 719, 722, 726, 730, 736, 740, 745, - 749, 753, 757, 762, 765, 767, 772, 777, 781, 787, 795, 799, 803, 807, 809, - 811, 812, 813, 813, 812, 812, 811, 812, 811, 808, 807, 807, 808, 809, 811, - 812, 813, 816, 819, 823, 827, 831, 838, 843, 847, 851, 854, 855, 856, 857, - 857, 857, 858, 859, 859, 859, 860, 861, 864, 867, 870, 872, 875, 877, 880, - 883, 887, 893, 896, 900, 903, 905, 907, 910, 912, 915, 916, 918, 921, 924, - 928, 931, 935, 942, 946, 950, 955, 961, 964, 967, 967, 967, 963, 959, 955, - 948, 943, 938, 934, 931, 930, 929, 931, 934, 939, 950, 958, 968, 979, 989, - 1007, 1020 - ], - "y": [ - 342, 341, 340, 335, 331, 326, 321, 315, 307, 301, 295, 289, 280, 275, 271, - 269, 266, 264, 263, 263, 265, 268, 271, 273, 274, 274, 275, 275, 275, 275, - 275, 274, 274, 274, 273, 273, 272, 272, 274, 277, 282, 286, 289, 292, 295, - 300, 303, 307, 312, 317, 320, 323, 326, 329, 331, 332, 333, 333, 333, 331, - 330, 327, 324, 318, 314, 309, 305, 300, 293, 289, 286, 283, 280, 279, 279, - 279, 281, 284, 287, 293, 297, 302, 307, 315, 319, 323, 326, 329, 331, 334, - 336, 336, 335, 333, 330, 327, 323, 315, 309, 303, 297, 291, 287, 284, 282, - 280, 278, 278, 277, 278, 279, 285, 289, 293, 296, 297, 298, 299, 299, 298, - 296, 294, 291, 286, 284, 281, 278, 276, 275, 275, 276, 277, 279, 285, 289, - 293, 297, 301, 308, 312, 316, 320, 324, 321, 314, 311, 308, 304, 299, 291, - 287, 283, 280, 280, 280, 280, 280, 282, 284, 288, 292, 298, 302, 306, 310, - 315, 320, 323, 326, 321, 315, 311, 307, 302, 295, 290, 287, 283, 280, 278, - 278, 277, 277, 278, 283, 288, 293, 297, 301, 306, 312, 316, 319, 323, 325, - 326, 325, 323, 319, 315, 311, 306, 299, 293, 288, 282, 278, 273, 271, 270, - 271, 272, 276, 281, 288, 295, 304, 309, 315, 321, 328, 332, 334, 335, 335, - 330, 326 - ] - } - ] \ No newline at end of file diff --git a/test/integration/strokes/Interact/tokyo.json b/test/integration/strokes/Interact/tokyo.json deleted file mode 100644 index 036831d0..00000000 --- a/test/integration/strokes/Interact/tokyo.json +++ /dev/null @@ -1,42 +0,0 @@ -[ - { - "x": [ - 502, 506, 509, 515, 523, 537, 545, 552, 557, 564, 569, 572, 577, 580, 586, - 590, 594, 597, 599, 600, 601, 602, 601, 600, 599, 595, 593, 590, 588, 586, - 585, 583, 582, 580, 578, 576, 575, 573, 569, 568, 566, 564, 562, 560, 559, - 559, 559, 560, 561, 563, 566, 572, 577, 584, 591, 598, 611, 619, 626, 634, - 644, 648, 651, 653, 654, 650, 645, 638, 630, 620, 614, 610, 607, 605, 605, - 605, 607, 610, 618, 623, 629, 635, 641, 651, 658, 663, 669, 675, 678, 679, - 678, 673, 667, 661, 653, 647, 641, 637, 637, 639, 648, 656, 663, 672, 684, - 692, 699, 707, 714, 724, 729, 733, 736, 737, 736, 735, 733, 728, 725, 722, - 717, 714, 712, 710, 708, 707, 705, 704, 704, 703, 703, 703, 702, 702, 702, - 705, 709, 711, 714, 719, 725, 728, 731, 736, 739, 742, 742, 740, 737, 730, - 725, 721, 718, 720, 723, 727, 730, 733, 736, 738, 742, 746, 750, 754, 759, - 769, 776, 783, 788, 792, 793, 791, 788, 785, 783, 782, 783, 786, 792, 798, - 803, 810, 821, 826, 829, 829, 827, 825, 824, 822, 821, 819, 816, 813, 808, - 798, 792, 786, 778, 770, 763, 762, 764, 770, 783, 793, 805, 817, 828, 843, - 852, 859, 865, 874, 880, 885, 888, 889, 890, 889, 886, 882, 877, 874, 871, - 867, 865, 864, 864, 866, 871, 875, 878, 881, 884, 891, 895, 899, 902, 903, - 902, 898, 894, 887, 883, 880, 878, 878, 882, 885, 889, 896, 904, 914, 917 - ], - "y": [ - 327, 326, 325, 322, 317, 306, 299, 291, 282, 265, 253, 242, 231, 222, 209, - 201, 193, 187, 179, 176, 173, 170, 173, 176, 179, 186, 190, 194, 198, 204, - 209, 213, 218, 223, 232, 238, 243, 248, 257, 263, 268, 274, 279, 287, 292, - 297, 305, 310, 314, 317, 319, 323, 326, 329, 331, 333, 334, 335, 334, 333, - 327, 323, 316, 310, 304, 298, 296, 294, 292, 292, 292, 293, 296, 300, 308, - 313, 318, 323, 329, 331, 333, 334, 334, 334, 332, 329, 325, 316, 311, 307, - 302, 296, 293, 290, 289, 288, 288, 292, 295, 299, 303, 304, 304, 302, 296, - 290, 284, 276, 267, 254, 245, 235, 223, 217, 213, 210, 207, 207, 210, 215, - 225, 235, 244, 252, 261, 269, 282, 290, 297, 305, 310, 315, 319, 323, 319, - 312, 305, 300, 296, 292, 288, 287, 287, 288, 289, 295, 304, 308, 310, 312, - 312, 310, 308, 305, 305, 306, 308, 311, 317, 320, 324, 327, 327, 327, 325, - 320, 314, 309, 304, 299, 294, 291, 291, 292, 296, 301, 308, 313, 318, 320, - 320, 319, 312, 308, 305, 308, 313, 321, 328, 334, 341, 353, 361, 368, 375, - 383, 385, 386, 386, 384, 378, 373, 366, 359, 350, 347, 345, 343, 341, 340, - 340, 339, 338, 334, 329, 324, 319, 314, 308, 305, 303, 302, 302, 303, 305, - 311, 318, 323, 327, 331, 334, 335, 336, 336, 335, 332, 328, 323, 316, 313, - 310, 306, 304, 302, 302, 302, 305, 309, 312, 312, 310, 306, 301, 294, 292 - ] - } - ] \ No newline at end of file diff --git a/test/integration/strokes/abrausorus.json b/test/integration/strokes/abrausorus.json deleted file mode 100644 index 24dbc17a..00000000 --- a/test/integration/strokes/abrausorus.json +++ /dev/null @@ -1,69 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 201, 198, 191, 188, 185, 182, 177, 174, 171, 172, 174, 177, 184, 188, 192, 196, 199, 202, 204, 206, 207, 209, 210, 209, 205, 204, 206, 209, 211, - 217, 223, 230, 235, 240, 247, 250, 255, 260, 263, 266, 267, 267, 265, 262, 259, 255, 252, 250, 249, 249, 250, 252, 254, 259, 263, 268, 273, 277, - 283, 288, 293, 298, 302, 303, 303, 303, 300, 297, 294, 291, 290, 292, 297, 300, 303, 307, 311, 314, 319, 323, 324, 324, 319, 316, 321, 326, 331, - 335, 338, 340, 340, 339, 337, 337, 341, 344, 351, 357, 362, 367, 370, 375, 377, 376, 373, 369, 364, 359, 356, 353, 352, 352, 355, 359, 363, 367, - 372, 375, 378, 379, 378, 375, 374, 377, 381, 387, 391, 394, 398, 401, 403, 404, 401, 401, 401, 408, 411, 414, 418, 423, 425, 426, 426, 424, 424, - 426, 429, 434, 438, 442, 448, 452, 455, 456, 455, 457, 463, 467, 471, 474, 474, 470, 467, 471, 475, 486, 493, 498, 502, 506, 504, 499, 495, 494, - 494, 496, 499, 503, 507, 513, 518, 520, 521, 520, 514, 510, 507, 504, 503, 504, 509, 513, 517, 522, 525, 529, 531, 534, 538, 543, 548, 550, 550, - 550, 552, 556, 559, 562, 565, 569, 570, 570, 567, 568, 572, 575, 578, 581, 586, 589, 591, 589, 590, 594, 597, 600, 602, 604, 606, 609, 614, 618, - 621, 623, 624, 621, 617, 614 - ], - "y": [ - 160, 159, 159, 159, 159, 160, 162, 164, 168, 172, 175, 177, 180, 180, 180, 180, 178, 176, 173, 169, 166, 161, 158, 155, 150, 154, 159, 165, 168, - 173, 175, 176, 176, 176, 175, 174, 169, 161, 155, 149, 144, 140, 133, 127, 124, 121, 121, 127, 133, 142, 148, 153, 159, 167, 170, 173, 175, 176, - 177, 177, 175, 171, 165, 161, 157, 154, 152, 151, 150, 150, 153, 156, 157, 157, 156, 154, 152, 152, 151, 147, 144, 141, 140, 142, 143, 143, 144, - 145, 147, 150, 155, 158, 161, 164, 166, 167, 166, 165, 163, 160, 158, 153, 149, 146, 145, 145, 145, 148, 151, 156, 159, 163, 169, 172, 173, 173, - 173, 171, 165, 161, 157, 153, 159, 163, 168, 172, 172, 172, 169, 164, 158, 154, 154, 158, 162, 166, 167, 167, 165, 161, 157, 154, 150, 153, 156, - 163, 167, 169, 170, 170, 167, 164, 159, 154, 149, 153, 157, 161, 165, 170, 177, 180, 177, 172, 169, 165, 162, 160, 159, 155, 152, 152, 157, 162, - 167, 173, 175, 176, 176, 172, 168, 164, 160, 156, 152, 151, 151, 152, 156, 159, 163, 164, 165, 164, 163, 158, 155, 152, 150, 150, 155, 158, 164, - 168, 172, 171, 170, 168, 165, 160, 157, 154, 157, 161, 166, 169, 170, 170, 167, 162, 157, 161, 165, 168, 169, 168, 165, 161, 156, 157, 160, 163, - 165, 168, 172, 174, 175, 175 - ], - "t": [ - 1692198864522, 1692198864757, 1692198864791, 1692198864807, 1692198864824, 1692198864841, 1692198864874, 1692198864907, 1692198864941, - 1692198864974, 1692198864991, 1692198865007, 1692198865024, 1692198865040, 1692198865057, 1692198865074, 1692198865091, 1692198865107, - 1692198865124, 1692198865141, 1692198865158, 1692198865174, 1692198865191, 1692198865208, 1692198865240, 1692198865307, 1692198865325, - 1692198865357, 1692198865374, 1692198865392, 1692198865408, 1692198865424, 1692198865441, 1692198865457, 1692198865474, 1692198865491, - 1692198865524, 1692198865541, 1692198865558, 1692198865574, 1692198865591, 1692198865608, 1692198865624, 1692198865641, 1692198865658, - 1692198865674, 1692198865708, 1692198865741, 1692198865757, 1692198865774, 1692198865791, 1692198865808, 1692198865824, 1692198865841, - 1692198865857, 1692198865875, 1692198865891, 1692198865908, 1692198865924, 1692198865941, 1692198865958, 1692198865976, 1692198865991, - 1692198866008, 1692198866024, 1692198866042, 1692198866058, 1692198866074, 1692198866091, 1692198866125, 1692198866158, 1692198866193, - 1692198866225, 1692198866241, 1692198866258, 1692198866275, 1692198866325, 1692198866358, 1692198866408, 1692198866441, 1692198866458, - 1692198866475, 1692198866508, 1692198866541, 1692198866575, 1692198866592, 1692198866609, 1692198866625, 1692198866641, 1692198866659, - 1692198866692, 1692198866708, 1692198866725, 1692198866742, 1692198866775, 1692198866792, 1692198866808, 1692198866825, 1692198866842, - 1692198866859, 1692198866875, 1692198866892, 1692198866926, 1692198866942, 1692198866959, 1692198866976, 1692198866992, 1692198867009, - 1692198867025, 1692198867042, 1692198867059, 1692198867075, 1692198867092, 1692198867109, 1692198867125, 1692198867142, 1692198867160, - 1692198867176, 1692198867194, 1692198867209, 1692198867225, 1692198867259, 1692198867342, 1692198867359, 1692198867376, 1692198867393, - 1692198867409, 1692198867426, 1692198867443, 1692198867459, 1692198867476, 1692198867493, 1692198867559, 1692198867576, 1692198867593, - 1692198867626, 1692198867642, 1692198867659, 1692198867676, 1692198867692, 1692198867709, 1692198867726, 1692198867759, 1692198867810, - 1692198867826, 1692198867843, 1692198867859, 1692198867876, 1692198867893, 1692198867910, 1692198867926, 1692198867943, 1692198867960, - 1692198867977, 1692198867993, 1692198868060, 1692198868076, 1692198868093, 1692198868110, 1692198868127, 1692198868143, 1692198868177, - 1692198868227, 1692198868260, 1692198868276, 1692198868293, 1692198868310, 1692198868326, 1692198868343, 1692198868376, 1692198868410, - 1692198868444, 1692198868478, 1692198868494, 1692198868510, 1692198868527, 1692198868543, 1692198868560, 1692198868577, 1692198868594, - 1692198868610, 1692198868627, 1692198868643, 1692198868660, 1692198868693, 1692198868710, 1692198868727, 1692198868743, 1692198868777, - 1692198868794, 1692198868810, 1692198868827, 1692198868844, 1692198868861, 1692198868877, 1692198868894, 1692198868993, 1692198869027, - 1692198869111, 1692198869127, 1692198869161, 1692198869177, 1692198869194, 1692198869211, 1692198869244, 1692198869277, 1692198869294, - 1692198869311, 1692198869327, 1692198869344, 1692198869360, 1692198869394, 1692198869461, 1692198869478, 1692198869494, 1692198869511, - 1692198869529, 1692198869545, 1692198869561, 1692198869578, 1692198869595, 1692198869678, 1692198869694, 1692198869711, 1692198869728, - 1692198869745, 1692198869761, 1692198869778, 1692198869795, 1692198869862, 1692198869878, 1692198869895, 1692198869912, 1692198869928, - 1692198869945, 1692198869962, 1692198869978, 1692198869995 - ], - "p": [ - 0.5, 0.82, 0.78, 0.68, 0.68, 0.68, 0.75, 0.7, 0.74, 0.72, 0.7, 0.7, 0.79, 0.71, 0.71, 0.71, 0.7, 0.7, 0.7, 0.73, 0.68, 0.75, 0.68, 0.68, 0.77, - 0.72, 0.75, 0.78, 0.7, 0.8, 0.77, 0.79, 0.74, 0.74, 0.79, 0.68, 0.79, 0.82, 0.78, 0.78, 0.75, 0.71, 0.79, 0.78, 0.72, 0.74, 0.68, 0.77, 0.77, - 0.81, 0.77, 0.75, 0.77, 0.82, 0.74, 0.76, 0.75, 0.72, 0.77, 0.74, 0.75, 0.77, 0.79, 0.72, 0.71, 0.68, 0.7, 0.68, 0.68, 0.68, 0.68, 0.7, 0.75, - 0.68, 0.68, 0.73, 0.73, 0.68, 0.75, 0.76, 0.68, 0.68, 0.75, 0.7, 0.75, 0.74, 0.75, 0.72, 0.7, 0.7, 0.74, 0.68, 0.7, 0.68, 0.73, 0.68, 0.79, - 0.77, 0.75, 0.76, 0.7, 0.79, 0.73, 0.68, 0.68, 0.71, 0.74, 0.76, 0.72, 0.76, 0.68, 0.71, 0.78, 0.74, 0.72, 0.71, 0.74, 0.7, 0.78, 0.72, 0.72, - 0.74, 0.77, 0.74, 0.77, 0.79, 0.71, 0.68, 0.74, 0.76, 0.77, 0.72, 0.68, 0.71, 0.71, 0.8, 0.68, 0.68, 0.73, 0.77, 0.73, 0.68, 0.71, 0.7, 0.68, - 0.79, 0.74, 0.75, 0.72, 0.71, 0.78, 0.74, 0.76, 0.75, 0.75, 0.73, 0.79, 0.76, 0.76, 0.76, 0.78, 0.74, 0.72, 0.77, 0.74, 0.66, 0.79, 0.75, 0.72, - 0.76, 0.7, 0.74, 0.77, 0.75, 0.74, 0.77, 0.7, 0.72, 0.71, 0.79, 0.77, 0.73, 0.72, 0.72, 0.79, 0.72, 0.68, 0.68, 0.72, 0.68, 0.77, 0.72, 0.72, - 0.75, 0.68, 0.77, 0.7, 0.72, 0.73, 0.74, 0.79, 0.7, 0.77, 0.71, 0.73, 0.72, 0.68, 0.7, 0.72, 0.77, 0.68, 0.68, 0.72, 0.72, 0.77, 0.72, 0.68, - 0.68, 0.76, 0.76, 0.75, 0.73, 0.72, 0.74, 0.68, 0.68, 0.7, 0.73, 0.75, 0.68, 0.76, 0.74, 0.7, 0.7, 0.72, 0.7, 0.72, 0.68 - ] - } -] diff --git a/test/integration/strokes/equation1.json b/test/integration/strokes/equation1.json deleted file mode 100644 index d23d6813..00000000 --- a/test/integration/strokes/equation1.json +++ /dev/null @@ -1,402 +0,0 @@ -[ - { - "x": [ - 73, - 74, - 74, - 75, - 75, - 76, - 77, - 82, - 85, - 89, - 93, - 95, - 95, - 95, - 96, - 96, - 96, - 96, - 95, - 94, - 93, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 91, - 87, - 83, - 78, - 73, - 69, - 69, - 69, - 70, - 72, - 77, - 81, - 84, - 90, - 94, - 97, - 101, - 107, - 110, - 113, - 119, - 122 - ], - "y": [ - 168, - 173, - 176, - 179, - 182, - 185, - 188, - 189, - 188, - 185, - 182, - 177, - 173, - 170, - 165, - 161, - 164, - 168, - 172, - 176, - 181, - 188, - 191, - 198, - 205, - 214, - 224, - 233, - 240, - 244, - 249, - 252, - 252, - 250, - 246, - 242, - 238, - 234, - 231, - 228, - 223, - 220, - 219, - 217, - 214, - 213, - 211, - 209, - 208, - 206, - 202, - 201 - ] - }, - { - "x": [ - 176, - 184, - 189, - 195, - 199 - ], - "y": [ - 171, - 170, - 168, - 167, - 166 - ] - }, - { - "x": [ - 170, - 176, - 185, - 194, - 199, - 202, - 205, - 211, - 214 - ], - "y": [ - 189, - 189, - 189, - 188, - 187, - 187, - 187, - 187, - 187 - ] - }, - { - "x": [ - 270, - 276, - 279, - 282, - 285, - 286, - 286, - 286, - 286, - 283, - 278, - 274, - 271, - 267, - 271, - 274, - 276, - 277, - 278, - 278, - 272, - 269, - 265, - 262, - 259, - 255 - ], - "y": [ - 145, - 145, - 145, - 146, - 149, - 152, - 156, - 161, - 164, - 167, - 168, - 169, - 170, - 170, - 170, - 172, - 175, - 178, - 181, - 184, - 187, - 189, - 191, - 191, - 192, - 192 - ] - }, - { - "x": [ - 311, - 314, - 317, - 321, - 324, - 327, - 331, - 335, - 337, - 337, - 337, - 334, - 331, - 326, - 323, - 320, - 315 - ], - "y": [ - 180, - 175, - 171, - 168, - 167, - 167, - 168, - 171, - 174, - 177, - 181, - 183, - 185, - 186, - 186, - 187, - 187 - ] - }, - { - "x": [ - 349, - 344, - 341, - 338, - 336, - 335, - 335, - 337, - 340, - 343, - 347, - 351, - 354, - 357 - ], - "y": [ - 170, - 170, - 170, - 172, - 175, - 178, - 181, - 184, - 185, - 186, - 186, - 186, - 186, - 186 - ] - }, - { - "x": [ - 381, - 386, - 393, - 400, - 403, - 407, - 410, - 415, - 419 - ], - "y": [ - 181, - 181, - 181, - 181, - 180, - 180, - 180, - 180, - 180 - ] - }, - { - "x": [ - 402, - 401, - 401, - 401, - 401, - 401, - 401, - 401 - ], - "y": [ - 169, - 175, - 178, - 181, - 186, - 190, - 193, - 196 - ] - }, - { - "x": [ - 461, - 457, - 456, - 455, - 455, - 461, - 465, - 469, - 473, - 476, - 478, - 479, - 480, - 481, - 481, - 481, - 480, - 478, - 476, - 473, - 470, - 465, - 460, - 457, - 455, - 462, - 470, - 476, - 480, - 485, - 491, - 495, - 498 - ], - "y": [ - 165, - 160, - 157, - 152, - 149, - 147, - 147, - 147, - 147, - 147, - 150, - 154, - 158, - 162, - 165, - 168, - 171, - 174, - 177, - 181, - 184, - 184, - 186, - 187, - 191, - 193, - 193, - 193, - 193, - 193, - 193, - 193, - 193 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/equation2.json b/test/integration/strokes/equation2.json deleted file mode 100644 index 11969294..00000000 --- a/test/integration/strokes/equation2.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "x": [ - 73, 74, 74, 75, 75, 76, 77, 82, 85, 89, 93, 95, 95, 95, 96, 96, 96, 96, - 95, 94, 93, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 87, 83, 78, 73, 69, - 69, 69, 70, 72, 77, 81, 84, 90, 94, 97, 101, 107, 110, 113, 119, 122 - ], - "y": [ - 168, 173, 176, 179, 182, 185, 188, 189, 188, 185, 182, 177, 173, 170, 165, - 161, 164, 168, 172, 176, 181, 188, 191, 198, 205, 214, 224, 233, 240, 244, - 249, 252, 252, 250, 246, 242, 238, 234, 231, 228, 223, 220, 219, 217, 214, - 213, 211, 209, 208, 206, 202, 201 - ] - }, - { - "x": [176, 184, 189, 195, 199], - "y": [171, 170, 168, 167, 166] - }, - { - "x": [170, 176, 185, 194, 199, 202, 205, 211, 214], - "y": [189, 189, 189, 188, 187, 187, 187, 187, 187] - }, - { - "x": [ - 270, 276, 279, 282, 285, 286, 286, 286, 286, 283, 278, 274, 271, 267, 271, - 274, 276, 277, 278, 278, 272, 269, 265, 262, 259, 255 - ], - "y": [ - 145, 145, 145, 146, 149, 152, 156, 161, 164, 167, 168, 169, 170, 170, 170, - 172, 175, 178, 181, 184, 187, 189, 191, 191, 192, 192 - ] - }, - { - "x": [ - 311, 314, 317, 321, 324, 327, 331, 335, 337, 337, 337, 334, 331, 326, 323, - 320, 315 - ], - "y": [ - 180, 175, 171, 168, 167, 167, 168, 171, 174, 177, 181, 183, 185, 186, 186, - 187, 187 - ] - }, - { - "x": [349, 344, 341, 338, 336, 335, 335, 337, 340, 343, 347, 351, 354, 357], - "y": [170, 170, 170, 172, 175, 178, 181, 184, 185, 186, 186, 186, 186, 186] - }, - { - "x": [381, 386, 393, 400, 403, 407, 410, 415, 419], - "y": [181, 181, 181, 181, 180, 180, 180, 180, 180] - }, - { - "x": [402, 401, 401, 401, 401, 401, 401, 401], - "y": [169, 175, 178, 181, 186, 190, 193, 196] - }, - { - "x": [ - 461, 457, 456, 455, 455, 461, 465, 469, 473, 476, 478, 479, 480, 481, 481, - 481, 480, 478, 476, 473, 470, 465, 460, 457, 455, 462, 470, 476, 480, 485, - 491, 495, 498 - ], - "y": [ - 165, 160, 157, 152, 149, 147, 147, 147, 147, 147, 150, 154, 158, 162, 165, - 168, 171, 174, 177, 181, 184, 184, 186, 187, 191, 193, 193, 193, 193, 193, - 193, 193, 193 - ] - } -] diff --git a/test/integration/strokes/fence.json b/test/integration/strokes/fence.json deleted file mode 100644 index 4d815069..00000000 --- a/test/integration/strokes/fence.json +++ /dev/null @@ -1,466 +0,0 @@ -[ - { - "x": [ - 234, - 237, - 238, - 239, - 242, - 244, - 246, - 247, - 249, - 250, - 252, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 254, - 255, - 257, - 258, - 258, - 262, - 266, - 273, - 283, - 297, - 313, - 325, - 338, - 345, - 349, - 353 - ], - "y": [ - 90, - 94, - 98, - 103, - 110, - 114, - 118, - 122, - 125, - 128, - 131, - 127, - 123, - 119, - 114, - 109, - 105, - 101, - 98, - 95, - 91, - 87, - 82, - 77, - 71, - 68, - 65, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64 - ] - }, - { - "x": [ - 297, - 301, - 305, - 310, - 313, - 317, - 322, - 324, - 324, - 324, - 322, - 319, - 315, - 311, - 314, - 318, - 322, - 326, - 326, - 326, - 322, - 317, - 312, - 307, - 302, - 298, - 294, - 290 - ], - "y": [ - 82, - 82, - 82, - 81, - 81, - 82, - 83, - 86, - 89, - 93, - 96, - 98, - 98, - 98, - 100, - 102, - 105, - 107, - 110, - 113, - 114, - 117, - 118, - 119, - 121, - 121, - 121, - 120 - ] - }, - { - "x": [ - 250, - 250, - 253, - 255, - 258, - 260, - 263, - 266, - 268, - 270, - 273, - 274, - 277, - 277, - 277, - 277, - 277, - 278, - 279, - 280, - 280, - 280, - 280, - 286, - 294, - 302, - 312, - 326, - 344, - 365, - 385, - 401, - 413, - 416 - ], - "y": [ - 198, - 202, - 209, - 215, - 222, - 229, - 237, - 243, - 250, - 256, - 262, - 265, - 260, - 254, - 246, - 236, - 223, - 208, - 198, - 194, - 189, - 185, - 182, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181 - ] - }, - { - "x": [ - 361, - 358, - 353, - 349, - 346, - 342, - 336, - 334, - 330, - 328, - 326, - 324, - 323, - 323, - 323, - 323, - 323, - 326, - 327, - 330, - 334, - 337, - 341, - 345, - 348, - 350, - 350, - 347, - 343, - 340, - 332, - 327, - 324, - 319 - ], - "y": [ - 212, - 210, - 209, - 208, - 208, - 208, - 211, - 214, - 218, - 221, - 225, - 230, - 234, - 242, - 247, - 254, - 258, - 264, - 267, - 269, - 270, - 270, - 268, - 266, - 262, - 259, - 254, - 253, - 251, - 250, - 248, - 248, - 248, - 248 - ] - }, - { - "x": [ - 229, - 226, - 223, - 220, - 216, - 213, - 210, - 206, - 205, - 202, - 201, - 200, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 198, - 196, - 194, - 190, - 186, - 182, - 176, - 169, - 163, - 156, - 151, - 146, - 143, - 139, - 136, - 134, - 133, - 133, - 135, - 138, - 142, - 146, - 150, - 151, - 154, - 156, - 157, - 157, - 157, - 157, - 157, - 157, - 157, - 154, - 151, - 148, - 145, - 140, - 135, - 134, - 134, - 134, - 134, - 135, - 136, - 136, - 138, - 144, - 151, - 162, - 174, - 183, - 193, - 202, - 214, - 222, - 228, - 233, - 236, - 241, - 244 - ], - "y": [ - 35, - 34, - 33, - 33, - 33, - 33, - 33, - 35, - 38, - 41, - 45, - 48, - 54, - 64, - 76, - 87, - 98, - 107, - 116, - 130, - 142, - 155, - 171, - 186, - 202, - 219, - 236, - 252, - 268, - 278, - 288, - 295, - 297, - 295, - 293, - 291, - 289, - 286, - 283, - 278, - 275, - 275, - 277, - 283, - 288, - 294, - 302, - 312, - 317, - 321, - 326, - 331, - 337, - 342, - 350, - 358, - 370, - 385, - 402, - 432, - 453, - 470, - 487, - 503, - 515, - 528, - 532, - 535, - 538, - 539, - 540, - 540, - 540, - 540, - 540, - 539, - 537, - 535, - 532, - 530, - 527, - 525, - 522 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/h.json b/test/integration/strokes/h.json deleted file mode 100644 index 6ce8f758..00000000 --- a/test/integration/strokes/h.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "x": [ - 397, 400, 404, 408, 411, 414, 417, 418, 418, 419, 419, 418, 414, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 413, 417, - 418, 419, 419, 421, 425, 426 - ], - "y": [ - 254, 249, 247, 242, 240, 235, 231, 227, 224, 220, 216, 211, 210, 213, 217, 221, 226, 230, 234, 238, 243, 247, 251, 255, 252, 248, 244, 241, 240, - 243, 247, 251, 254, 253, 250 - ] - } -] diff --git a/test/integration/strokes/hello.json b/test/integration/strokes/hello.json deleted file mode 100644 index 02810bbf..00000000 --- a/test/integration/strokes/hello.json +++ /dev/null @@ -1,264 +0,0 @@ -[ - { - "x": [ - 397, - 400, - 404, - 408, - 411, - 414, - 417, - 418, - 418, - 419, - 419, - 418, - 414, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 413, - 417, - 418, - 419, - 419, - 421, - 425, - 426 - ], - "y": [ - 254, - 249, - 247, - 242, - 240, - 235, - 231, - 227, - 224, - 220, - 216, - 211, - 210, - 213, - 217, - 221, - 226, - 230, - 234, - 238, - 243, - 247, - 251, - 255, - 252, - 248, - 244, - 241, - 240, - 243, - 247, - 251, - 254, - 253, - 250 - ] - }, - { - "x": [ - 427, - 433, - 437, - 440, - 439, - 435, - 430, - 428, - 428, - 429, - 432, - 436, - 440, - 443 - ], - "y": [ - 244, - 248, - 245, - 242, - 238, - 238, - 240, - 245, - 249, - 253, - 253, - 253, - 251, - 251 - ] - }, - { - "x": [ - 443, - 450, - 453, - 456, - 459, - 460, - 461, - 461, - 461, - 460, - 456, - 452, - 450, - 450, - 450, - 450, - 450, - 450, - 450, - 450, - 449, - 449, - 451, - 455, - 460, - 463, - 464 - ], - "y": [ - 242, - 242, - 242, - 238, - 236, - 233, - 230, - 226, - 222, - 217, - 214, - 214, - 219, - 223, - 227, - 231, - 234, - 238, - 242, - 246, - 249, - 253, - 257, - 257, - 255, - 252, - 249 - ] - }, - { - "x": [ - 464, - 466, - 469, - 471, - 472, - 474, - 475, - 473, - 469, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 466, - 467, - 470, - 474, - 480, - 482 - ], - "y": [ - 243, - 236, - 234, - 230, - 227, - 223, - 219, - 216, - 215, - 216, - 220, - 225, - 229, - 233, - 237, - 240, - 244, - 248, - 252, - 255, - 256, - 254, - 250, - 247 - ] - }, - { - "x": [ - 489, - 483, - 482, - 482, - 482, - 485, - 489, - 494, - 495, - 495, - 492, - 490, - 494, - 497, - 501, - 504 - ], - "y": [ - 238, - 242, - 245, - 249, - 253, - 254, - 252, - 248, - 244, - 239, - 238, - 242, - 242, - 239, - 238, - 236 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/helloHowAreYou.json b/test/integration/strokes/helloHowAreYou.json deleted file mode 100644 index 622f263d..00000000 --- a/test/integration/strokes/helloHowAreYou.json +++ /dev/null @@ -1,762 +0,0 @@ -[ - { - "x": [ - 306, - 311, - 315, - 320, - 323, - 326, - 330, - 331, - 332, - 334, - 335, - 335, - 335, - 331, - 327, - 326, - 326, - 326, - 326, - 326, - 326, - 327, - 328, - 328, - 329, - 329, - 330, - 330, - 331, - 331, - 331, - 332, - 334, - 338, - 340, - 340, - 341, - 345, - 348, - 352, - 357, - 360, - 363, - 364, - 363, - 359, - 356, - 353, - 353, - 353, - 358, - 363, - 367, - 371, - 376, - 379, - 382, - 383, - 384, - 386, - 386, - 386, - 386, - 386, - 383, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 379, - 383, - 388, - 391, - 393, - 396, - 399, - 401, - 402, - 402, - 402, - 402, - 402, - 399, - 396, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 395, - 399, - 402, - 404, - 407, - 410, - 412, - 414, - 411, - 410, - 410, - 411, - 415, - 418, - 421, - 424, - 425, - 426, - 426, - 422, - 418, - 416, - 419, - 423, - 428, - 432, - 436, - 440 - ], - "y": [ - 255, - 257, - 254, - 250, - 246, - 241, - 235, - 232, - 228, - 224, - 220, - 216, - 212, - 210, - 214, - 217, - 221, - 225, - 228, - 231, - 234, - 237, - 242, - 246, - 250, - 253, - 258, - 262, - 259, - 256, - 252, - 248, - 243, - 243, - 247, - 251, - 256, - 258, - 257, - 255, - 252, - 248, - 245, - 241, - 238, - 240, - 242, - 246, - 249, - 253, - 254, - 254, - 254, - 254, - 252, - 248, - 242, - 238, - 234, - 229, - 226, - 223, - 219, - 215, - 213, - 215, - 218, - 223, - 228, - 232, - 235, - 238, - 242, - 247, - 251, - 251, - 252, - 249, - 246, - 244, - 239, - 234, - 230, - 226, - 222, - 219, - 216, - 212, - 212, - 215, - 220, - 224, - 228, - 232, - 235, - 239, - 243, - 247, - 250, - 254, - 258, - 258, - 258, - 255, - 253, - 249, - 246, - 242, - 242, - 246, - 249, - 253, - 253, - 253, - 253, - 252, - 249, - 245, - 240, - 236, - 236, - 241, - 242, - 242, - 242, - 242, - 240, - 240 - ] - }, - { - "x": [ - 483, - 489, - 493, - 496, - 500, - 503, - 506, - 508, - 511, - 511, - 511, - 508, - 504, - 502, - 502, - 502, - 502, - 502, - 502, - 502, - 503, - 503, - 503, - 503, - 503, - 504, - 509, - 511, - 512, - 512, - 515, - 520, - 523, - 524, - 525, - 526, - 526, - 526, - 526, - 530, - 534, - 538, - 540, - 540, - 539, - 536, - 533, - 528, - 525, - 524, - 527, - 530, - 533, - 537, - 541, - 546, - 550, - 554, - 552, - 552, - 552, - 552, - 552, - 554, - 557, - 560, - 563, - 564, - 564, - 564, - 564, - 564, - 564, - 564, - 564, - 567, - 571, - 576, - 580, - 582, - 582, - 582, - 582, - 579, - 580, - 585, - 588 - ], - "y": [ - 240, - 240, - 240, - 240, - 240, - 238, - 233, - 230, - 224, - 221, - 217, - 215, - 216, - 221, - 226, - 229, - 232, - 236, - 240, - 243, - 248, - 252, - 256, - 253, - 249, - 244, - 243, - 247, - 251, - 254, - 256, - 257, - 254, - 251, - 248, - 244, - 248, - 252, - 255, - 257, - 257, - 254, - 249, - 245, - 242, - 239, - 237, - 237, - 240, - 244, - 244, - 243, - 243, - 242, - 242, - 242, - 239, - 236, - 241, - 244, - 247, - 251, - 254, - 258, - 255, - 254, - 249, - 245, - 242, - 239, - 235, - 238, - 241, - 245, - 249, - 253, - 254, - 256, - 252, - 248, - 245, - 242, - 237, - 235, - 238, - 238, - 238 - ] - }, - { - "x": [ - 661, - 656, - 654, - 654, - 654, - 655, - 658, - 661, - 665, - 669, - 672, - 675, - 675, - 674, - 670, - 666, - 662, - 659, - 655, - 655 - ], - "y": [ - 234, - 234, - 238, - 241, - 245, - 249, - 254, - 254, - 254, - 252, - 249, - 245, - 241, - 238, - 234, - 232, - 232, - 232, - 236, - 239 - ] - }, - { - "x": [ - 677, - 677, - 677, - 677, - 680, - 684, - 688, - 693, - 694, - 694, - 695, - 694, - 697, - 701, - 704, - 707, - 710, - 710, - 710, - 710, - 712, - 716, - 719, - 722, - 725, - 730, - 732, - 735, - 735, - 733, - 729, - 725, - 725, - 725, - 725, - 733, - 740, - 743, - 750, - 753, - 759, - 763, - 770, - 774 - ], - "y": [ - 236, - 242, - 246, - 251, - 253, - 254, - 254, - 252, - 248, - 244, - 241, - 238, - 233, - 233, - 233, - 232, - 234, - 237, - 241, - 245, - 248, - 249, - 249, - 249, - 249, - 246, - 243, - 241, - 237, - 232, - 231, - 237, - 241, - 245, - 248, - 254, - 256, - 256, - 255, - 253, - 250, - 250, - 250, - 250 - ] - }, - { - "x": [ - 829, - 829, - 830, - 832, - 837, - 841, - 844, - 847, - 848, - 846, - 846, - 846, - 848, - 850, - 851, - 851, - 852, - 853, - 853, - 853, - 850, - 845, - 841, - 841, - 843, - 845, - 848, - 852, - 854, - 858, - 863, - 866, - 868, - 864, - 864, - 864, - 865, - 868, - 871, - 871, - 873, - 874, - 871, - 867, - 867, - 871, - 875, - 880, - 884, - 885, - 884, - 884, - 886, - 889, - 891, - 894, - 895, - 897, - 897, - 897, - 897, - 899, - 903, - 908, - 913 - ], - "y": [ - 231, - 241, - 246, - 249, - 249, - 245, - 240, - 237, - 232, - 237, - 243, - 249, - 254, - 260, - 263, - 267, - 271, - 274, - 277, - 282, - 284, - 281, - 278, - 273, - 269, - 263, - 259, - 255, - 251, - 248, - 243, - 241, - 238, - 238, - 243, - 246, - 250, - 252, - 250, - 247, - 244, - 239, - 235, - 236, - 239, - 240, - 239, - 238, - 236, - 240, - 244, - 247, - 252, - 251, - 248, - 244, - 241, - 237, - 241, - 244, - 251, - 255, - 260, - 259, - 256 - ] - }, - { - "x": [ - 951, - 948, - 948, - 949, - 952, - 956, - 960, - 963, - 963, - 961, - 959, - 954, - 953, - 953 - ], - "y": [ - 233, - 228, - 225, - 221, - 217, - 217, - 217, - 222, - 226, - 230, - 233, - 237, - 240, - 244 - ] - }, - { - "x": [ - 955 - ], - "y": [ - 255 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/helloOneStroke.json b/test/integration/strokes/helloOneStroke.json deleted file mode 100644 index 761ac9bb..00000000 --- a/test/integration/strokes/helloOneStroke.json +++ /dev/null @@ -1,442 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 335, - 340, - 352, - 359, - 366, - 368, - 367, - 363, - 359, - 356, - 352, - 349, - 345, - 341, - 340, - 341, - 341, - 341, - 342, - 342, - 344, - 342, - 342, - 343, - 345, - 346, - 349, - 351, - 357, - 359, - 360, - 360, - 360, - 363, - 366, - 372, - 376, - 380, - 383, - 382, - 378, - 375, - 372, - 372, - 371, - 372, - 375, - 380, - 383, - 390, - 396, - 400, - 403, - 405, - 403, - 400, - 398, - 395, - 393, - 392, - 392, - 392, - 393, - 395, - 399, - 402, - 408, - 412, - 417, - 421, - 423, - 424, - 422, - 420, - 417, - 414, - 412, - 409, - 409, - 410, - 413, - 414, - 416, - 417, - 417, - 419, - 422, - 425, - 430, - 434, - 437, - 438, - 437, - 436, - 440, - 443, - 446, - 442, - 439, - 436, - 433, - 437, - 441, - 448, - 452, - 455, - 458 - ], - "y": [ - 229, - 224, - 216, - 210, - 204, - 196, - 191, - 187, - 184, - 184, - 187, - 193, - 202, - 211, - 218, - 223, - 226, - 231, - 234, - 238, - 242, - 239, - 234, - 231, - 228, - 225, - 222, - 219, - 223, - 226, - 232, - 237, - 241, - 243, - 242, - 238, - 236, - 232, - 228, - 224, - 224, - 225, - 229, - 232, - 235, - 238, - 240, - 242, - 242, - 240, - 237, - 232, - 227, - 218, - 213, - 204, - 200, - 199, - 207, - 212, - 220, - 229, - 238, - 241, - 243, - 243, - 241, - 238, - 234, - 231, - 226, - 222, - 216, - 213, - 211, - 209, - 206, - 205, - 212, - 217, - 222, - 228, - 232, - 236, - 239, - 242, - 243, - 242, - 242, - 241, - 239, - 236, - 233, - 236, - 239, - 239, - 238, - 234, - 231, - 230, - 230, - 226, - 226, - 226, - 226, - 227, - 226 - ], - "t": [ - 1689715440342, - 1689715440389, - 1689715440405, - 1689715440421, - 1689715440438, - 1689715440455, - 1689715440471, - 1689715440488, - 1689715440505, - 1689715440521, - 1689715440574, - 1689715440588, - 1689715440605, - 1689715440621, - 1689715440638, - 1689715440655, - 1689715440671, - 1689715440687, - 1689715440704, - 1689715440738, - 1689715441024, - 1689715441154, - 1689715441170, - 1689715441204, - 1689715441237, - 1689715441254, - 1689715441271, - 1689715441304, - 1689715441403, - 1689715441437, - 1689715441454, - 1689715441471, - 1689715441487, - 1689715441520, - 1689715441620, - 1689715441636, - 1689715441654, - 1689715441671, - 1689715441686, - 1689715441721, - 1689715441753, - 1689715441770, - 1689715441820, - 1689715441836, - 1689715441853, - 1689715441870, - 1689715441887, - 1689715441903, - 1689715441920, - 1689715441953, - 1689715441970, - 1689715441986, - 1689715442003, - 1689715442020, - 1689715442037, - 1689715442053, - 1689715442069, - 1689715442170, - 1689715442187, - 1689715442203, - 1689715442219, - 1689715442237, - 1689715442253, - 1689715442269, - 1689715442353, - 1689715442370, - 1689715442402, - 1689715442419, - 1689715442436, - 1689715442453, - 1689715442469, - 1689715442486, - 1689715442503, - 1689715442519, - 1689715442536, - 1689715442553, - 1689715442587, - 1689715442669, - 1689715442686, - 1689715442702, - 1689715442719, - 1689715442736, - 1689715442752, - 1689715442769, - 1689715442786, - 1689715442819, - 1689715442869, - 1689715442902, - 1689715442919, - 1689715442936, - 1689715442969, - 1689715443002, - 1689715443052, - 1689715443145, - 1689715443185, - 1689715443202, - 1689715443219, - 1689715443335, - 1689715443352, - 1689715443368, - 1689715443385, - 1689715443535, - 1689715443552, - 1689715443569, - 1689715443585, - 1689715443602, - 1689715443685 - ], - "p": [ - 0.5, - 0.73, - 0.66, - 0.81, - 0.81, - 0.8, - 0.75, - 0.76, - 0.74, - 0.68, - 0.74, - 0.78, - 0.82, - 0.82, - 0.79, - 0.75, - 0.68, - 0.74, - 0.68, - 0.71, - 0.73, - 0.7, - 0.74, - 0.68, - 0.7, - 0.68, - 0.72, - 0.7, - 0.79, - 0.7, - 0.77, - 0.74, - 0.71, - 0.7, - 0.68, - 0.79, - 0.73, - 0.76, - 0.74, - 0.72, - 0.71, - 0.68, - 0.74, - 0.68, - 0.68, - 0.68, - 0.7, - 0.75, - 0.68, - 0.79, - 0.78, - 0.77, - 0.76, - 0.81, - 0.75, - 0.82, - 0.73, - 0.68, - 0.8, - 0.75, - 0.8, - 0.81, - 0.81, - 0.7, - 0.73, - 0.68, - 0.77, - 0.74, - 0.77, - 0.74, - 0.75, - 0.72, - 0.77, - 0.7, - 0.7, - 0.7, - 0.7, - 0.68, - 0.78, - 0.75, - 0.76, - 0.77, - 0.73, - 0.72, - 0.68, - 0.7, - 0.68, - 0.68, - 0.74, - 0.72, - 0.7, - 0.68, - 0.68, - 0.68, - 0.74, - 0.68, - 0.68, - 0.76, - 0.72, - 0.68, - 0.68, - 0.76, - 0.71, - 0.78, - 0.71, - 0.68, - 0.68 - ] - } -] diff --git a/test/integration/strokes/helloOneStrokeSurrounded.json b/test/integration/strokes/helloOneStrokeSurrounded.json deleted file mode 100644 index e8e3d0a5..00000000 --- a/test/integration/strokes/helloOneStrokeSurrounded.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "x": [ - 335, 340, 352, 359, 366, 368, 367, 363, 359, 356, 352, 349, 345, 341, 340, 341, 341, 341, 342, 342, 344, 342, 342, 343, 345, 346, 349, 351, 357, - 359, 360, 360, 360, 363, 366, 372, 376, 380, 383, 382, 378, 375, 372, 372, 371, 372, 375, 380, 383, 390, 396, 400, 403, 405, 403, 400, 398, 395, - 393, 392, 392, 392, 393, 395, 399, 402, 408, 412, 417, 421, 423, 424, 422, 420, 417, 414, 412, 409, 409, 410, 413, 414, 416, 417, 417, 419, 422, - 425, 430, 434, 437, 438, 437, 436, 440, 443, 446, 442, 439, 436, 433, 437, 441, 448, 452, 455, 458 - ], - "y": [ - 229, 224, 216, 210, 204, 196, 191, 187, 184, 184, 187, 193, 202, 211, 218, 223, 226, 231, 234, 238, 242, 239, 234, 231, 228, 225, 222, 219, 223, - 226, 232, 237, 241, 243, 242, 238, 236, 232, 228, 224, 224, 225, 229, 232, 235, 238, 240, 242, 242, 240, 237, 232, 227, 218, 213, 204, 200, 199, - 207, 212, 220, 229, 238, 241, 243, 243, 241, 238, 234, 231, 226, 222, 216, 213, 211, 209, 206, 205, 212, 217, 222, 228, 232, 236, 239, 242, 243, - 242, 242, 241, 239, 236, 233, 236, 239, 239, 238, 234, 231, 230, 230, 226, 226, 226, 226, 227, 226 - ], - "t": [ - 1689715440342, 1689715440389, 1689715440405, 1689715440421, 1689715440438, 1689715440455, 1689715440471, 1689715440488, 1689715440505, - 1689715440521, 1689715440574, 1689715440588, 1689715440605, 1689715440621, 1689715440638, 1689715440655, 1689715440671, 1689715440687, - 1689715440704, 1689715440738, 1689715441024, 1689715441154, 1689715441170, 1689715441204, 1689715441237, 1689715441254, 1689715441271, - 1689715441304, 1689715441403, 1689715441437, 1689715441454, 1689715441471, 1689715441487, 1689715441520, 1689715441620, 1689715441636, - 1689715441654, 1689715441671, 1689715441686, 1689715441721, 1689715441753, 1689715441770, 1689715441820, 1689715441836, 1689715441853, - 1689715441870, 1689715441887, 1689715441903, 1689715441920, 1689715441953, 1689715441970, 1689715441986, 1689715442003, 1689715442020, - 1689715442037, 1689715442053, 1689715442069, 1689715442170, 1689715442187, 1689715442203, 1689715442219, 1689715442237, 1689715442253, - 1689715442269, 1689715442353, 1689715442370, 1689715442402, 1689715442419, 1689715442436, 1689715442453, 1689715442469, 1689715442486, - 1689715442503, 1689715442519, 1689715442536, 1689715442553, 1689715442587, 1689715442669, 1689715442686, 1689715442702, 1689715442719, - 1689715442736, 1689715442752, 1689715442769, 1689715442786, 1689715442819, 1689715442869, 1689715442902, 1689715442919, 1689715442936, - 1689715442969, 1689715443002, 1689715443052, 1689715443145, 1689715443185, 1689715443202, 1689715443219, 1689715443335, 1689715443352, - 1689715443368, 1689715443385, 1689715443535, 1689715443552, 1689715443569, 1689715443585, 1689715443602, 1689715443685 - ], - "p": [ - 0.5, 0.73, 0.66, 0.81, 0.81, 0.8, 0.75, 0.76, 0.74, 0.68, 0.74, 0.78, 0.82, 0.82, 0.79, 0.75, 0.68, 0.74, 0.68, 0.71, 0.73, 0.7, 0.74, 0.68, - 0.7, 0.68, 0.72, 0.7, 0.79, 0.7, 0.77, 0.74, 0.71, 0.7, 0.68, 0.79, 0.73, 0.76, 0.74, 0.72, 0.71, 0.68, 0.74, 0.68, 0.68, 0.68, 0.7, 0.75, 0.68, - 0.79, 0.78, 0.77, 0.76, 0.81, 0.75, 0.82, 0.73, 0.68, 0.8, 0.75, 0.8, 0.81, 0.81, 0.7, 0.73, 0.68, 0.77, 0.74, 0.77, 0.74, 0.75, 0.72, 0.77, - 0.7, 0.7, 0.7, 0.7, 0.68, 0.78, 0.75, 0.76, 0.77, 0.73, 0.72, 0.68, 0.7, 0.68, 0.68, 0.74, 0.72, 0.7, 0.68, 0.68, 0.68, 0.74, 0.68, 0.68, 0.76, - 0.72, 0.68, 0.68, 0.76, 0.71, 0.78, 0.71, 0.68, 0.68 - ] - }, - { - "x": [ - 386, 382, 368, 360, 352, 347, 343, 339, 335, 332, 328, 325, 323, 319, 317, 314, 311, 309, 309, 308, 308, 307, 307, 307, 307, 307, 307, 307, 308, - 311, 315, 323, 330, 334, 339, 345, 350, 356, 362, 365, 374, 377, 382, 385, 388, 391, 396, 399, 403, 407, 412, 419, 428, 438, 442, 446, 451, 454, - 458, 461, 465, 469, 469, 470, 471, 471, 471, 471, 470, 468, 466, 464, 462, 460, 457, 455, 451, 445, 440, 437, 429, 425, 421, 418, 415, 410, 404, - 396, 392, 389, 384, 381, 376, 373 - ], - "y": [ - 168, 168, 168, 168, 168, 168, 169, 169, 170, 171, 174, 176, 180, 182, 185, 191, 197, 203, 207, 212, 216, 219, 225, 228, 231, 238, 244, 247, 251, - 254, 256, 256, 257, 258, 258, 258, 258, 260, 260, 260, 261, 262, 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 263, 263, 262, - 261, 259, 256, 251, 248, 245, 242, 237, 233, 230, 225, 222, 219, 215, 212, 208, 205, 202, 196, 191, 188, 184, 181, 179, 178, 177, 177, 176, 174, - 172, 172, 171, 170, 169, 168, 167 - ], - "t": [ - 1689777777997, 1689777778043, 1689777778095, 1689777778112, 1689777778131, 1689777778145, 1689777778162, 1689777778195, 1689777778212, - 1689777778229, 1689777778262, 1689777778279, 1689777778295, 1689777778312, 1689777778328, 1689777778345, 1689777778361, 1689777778395, - 1689777778411, 1689777778428, 1689777778462, 1689777778478, 1689777778512, 1689777778528, 1689777778545, 1689777778578, 1689777778612, - 1689777778628, 1689777778645, 1689777778679, 1689777778695, 1689777778728, 1689777778746, 1689777778762, 1689777778779, 1689777778795, - 1689777778812, 1689777778829, 1689777778846, 1689777778862, 1689777778879, 1689777778896, 1689777778913, 1689777778929, 1689777778946, - 1689777778979, 1689777779013, 1689777779046, 1689777779079, 1689777779096, 1689777779113, 1689777779129, 1689777779146, 1689777779162, - 1689777779179, 1689777779196, 1689777779212, 1689777779229, 1689777779246, 1689777779330, 1689777779363, 1689777779396, 1689777779412, - 1689777779430, 1689777779446, 1689777779462, 1689777779480, 1689777779496, 1689777779529, 1689777779547, 1689777779563, 1689777779597, - 1689777779612, 1689777779646, 1689777779679, 1689777779696, 1689777779730, 1689777779763, 1689777779797, 1689777779813, 1689777779847, - 1689777779863, 1689777779880, 1689777779896, 1689777779913, 1689777779946, 1689777779980, 1689777779997, 1689777780013, 1689777780030, - 1689777780063, 1689777780097, 1689777780130, 1689777780163 - ], - "p": [ - 0.5, 0.8, 0.56, 0.8, 0.8, 0.74, 0.72, 0.71, 0.72, 0.68, 0.74, 0.7, 0.73, 0.73, 0.7, 0.78, 0.78, 0.77, 0.71, 0.75, 0.71, 0.68, 0.77, 0.68, 0.68, - 0.78, 0.77, 0.68, 0.72, 0.72, 0.73, 0.8, 0.79, 0.72, 0.74, 0.77, 0.74, 0.77, 0.77, 0.68, 0.81, 0.68, 0.75, 0.68, 0.68, 0.68, 0.74, 0.68, 0.71, - 0.71, 0.74, 0.78, 0.81, 0.68, 0.71, 0.72, 0.74, 0.68, 0.72, 0.7, 0.74, 0.77, 0.68, 0.68, 0.68, 0.74, 0.71, 0.68, 0.75, 0.7, 0.7, 0.73, 0.7, - 0.73, 0.72, 0.7, 0.79, 0.8, 0.76, 0.74, 0.81, 0.73, 0.72, 0.68, 0.68, 0.75, 0.77, 0.8, 0.71, 0.68, 0.75, 0.68, 0.75, 0.68 - ] - } -] diff --git a/test/integration/strokes/helloStrike.json b/test/integration/strokes/helloStrike.json deleted file mode 100644 index 6f0a0b12..00000000 --- a/test/integration/strokes/helloStrike.json +++ /dev/null @@ -1,410 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 261, - 262, - 265, - 270, - 276, - 280, - 282, - 283, - 280, - 273, - 269, - 266, - 266, - 264, - 263, - 264, - 264, - 264, - 264, - 264, - 264, - 265, - 268, - 271, - 275, - 277, - 281, - 286, - 290, - 293, - 293, - 290, - 287, - 287, - 290, - 295, - 299, - 304, - 313, - 325, - 331, - 332, - 328, - 323, - 319, - 318, - 316, - 315, - 315, - 315, - 318, - 320, - 323, - 327, - 331, - 334, - 337, - 342, - 347, - 349, - 348, - 346, - 343, - 341, - 340, - 338, - 337, - 338, - 338, - 340, - 345, - 348, - 352, - 353, - 352, - 357, - 361, - 364, - 367, - 370, - 370, - 369, - 365, - 361, - 368, - 376, - 382, - 386 - ], - "y": [ - 292, - 289, - 285, - 282, - 273, - 263, - 258, - 251, - 247, - 244, - 249, - 256, - 261, - 267, - 272, - 279, - 285, - 291, - 294, - 291, - 288, - 285, - 282, - 281, - 286, - 289, - 293, - 288, - 287, - 285, - 282, - 283, - 284, - 287, - 290, - 291, - 291, - 289, - 284, - 275, - 267, - 260, - 250, - 244, - 246, - 252, - 259, - 265, - 271, - 278, - 284, - 288, - 291, - 292, - 293, - 292, - 288, - 281, - 272, - 263, - 256, - 252, - 253, - 256, - 260, - 265, - 273, - 279, - 286, - 289, - 292, - 292, - 289, - 284, - 289, - 292, - 291, - 290, - 288, - 286, - 283, - 279, - 277, - 277, - 277, - 277, - 278, - 279 - ], - "t": [ - 1691512951866, - 1691512951913, - 1691512951935, - 1691512951952, - 1691512951968, - 1691512951985, - 1691512952001, - 1691512952018, - 1691512952036, - 1691512952051, - 1691512952085, - 1691512952102, - 1691512952118, - 1691512952135, - 1691512952152, - 1691512952168, - 1691512952186, - 1691512952202, - 1691512952262, - 1691512952385, - 1691512952402, - 1691512952419, - 1691512952452, - 1691512952486, - 1691512952536, - 1691512952552, - 1691512952585, - 1691512952668, - 1691512952686, - 1691512952702, - 1691512952735, - 1691512952752, - 1691512952785, - 1691512952819, - 1691512952852, - 1691512952885, - 1691512952902, - 1691512952918, - 1691512952935, - 1691512952952, - 1691512952968, - 1691512952985, - 1691512953002, - 1691512953018, - 1691512953068, - 1691512953085, - 1691512953102, - 1691512953118, - 1691512953136, - 1691512953152, - 1691512953168, - 1691512953185, - 1691512953202, - 1691512953218, - 1691512953252, - 1691512953269, - 1691512953286, - 1691512953302, - 1691512953319, - 1691512953335, - 1691512953352, - 1691512953368, - 1691512953436, - 1691512953452, - 1691512953469, - 1691512953485, - 1691512953502, - 1691512953518, - 1691512953535, - 1691512953552, - 1691512953585, - 1691512953602, - 1691512953672, - 1691512953702, - 1691512953785, - 1691512953818, - 1691512953835, - 1691512953852, - 1691512953868, - 1691512953885, - 1691512953902, - 1691512953919, - 1691512953935, - 1691512953952, - 1691512954085, - 1691512954102, - 1691512954119, - 1691512954135 - ], - "p": [ - 0.5, - 0.82, - 0.74, - 0.76, - 0.67, - 0.67, - 0.75, - 0.79, - 0.74, - 0.79, - 0.77, - 0.79, - 0.74, - 0.77, - 0.75, - 0.79, - 0.77, - 0.77, - 0.68, - 0.68, - 0.68, - 0.68, - 0.72, - 0.68, - 0.77, - 0.7, - 0.76, - 0.79, - 0.72, - 0.7, - 0.68, - 0.68, - 0.68, - 0.68, - 0.72, - 0.75, - 0.71, - 0.75, - 0.68, - 0.61, - 0.68, - 0.79, - 0.67, - 0.8, - 0.73, - 0.77, - 0.79, - 0.77, - 0.77, - 0.78, - 0.78, - 0.73, - 0.72, - 0.72, - 0.72, - 0.68, - 0.74, - 0.81, - 0.68, - 0.81, - 0.79, - 0.73, - 0.68, - 0.7, - 0.72, - 0.75, - 0.8, - 0.77, - 0.78, - 0.7, - 0.76, - 0.68, - 0.74, - 0.75, - 0.75, - 0.76, - 0.72, - 0.68, - 0.7, - 0.7, - 0.68, - 0.72, - 0.73, - 0.71, - 0.78, - 0.8, - 0.77, - 0.72 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 252, - 255, - 275, - 313, - 355, - 388, - 395, - 391 - ], - "y": [ - 287, - 287, - 290, - 290, - 283, - 279, - 278, - 276 - ], - "t": [ - 1691512954733, - 1691512954752, - 1691512954769, - 1691512954786, - 1691512954803, - 1691512954819, - 1691512954836, - 1691512954885 - ], - "p": [ - 0.5, - 0.83, - 0.45, - 0.38, - 0.35, - 0.42, - 0.79, - 0.73 - ] - } -] diff --git a/test/integration/strokes/line.json b/test/integration/strokes/line.json deleted file mode 100644 index 4fd10495..00000000 --- a/test/integration/strokes/line.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "p": [ - 0.5, - 0.77, - 0.63, - 0.59, - 0.55, - 0.53, - 0.5, - 0.52, - 0.63, - 0.75, - 0.68 - ], - "t": [ - 1688462301914, - 1688462302006, - 1688462302021, - 1688462302038, - 1688462302055, - 1688462302072, - 1688462302088, - 1688462302105, - 1688462302121, - 1688462302138, - 1688462302180 - ], - "x": [ - 227, - 232, - 244, - 261, - 281, - 303, - 328, - 351, - 365, - 370, - 373 - ], - "y": [ - 177, - 178, - 179, - 179, - 179, - 179, - 179, - 179, - 178, - 177, - 176 - ] - } -] diff --git a/test/integration/strokes/multiple-inputs/1943.json b/test/integration/strokes/multiple-inputs/1943.json deleted file mode 100644 index 8f1c2732..00000000 --- a/test/integration/strokes/multiple-inputs/1943.json +++ /dev/null @@ -1,688 +0,0 @@ -[ - { - "id": "mouse-1694171176026", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 165, - "y": 80, - "t": 1694171176026, - "p": 0.1 - }, - { - "x": 168, - "y": 78, - "t": 1694171176066, - "p": 0.7 - }, - { - "x": 174, - "y": 74, - "t": 1694171176084, - "p": 0.79 - }, - { - "x": 206, - "y": 50, - "t": 1694171176099, - "p": 0.37 - }, - { - "x": 220, - "y": 38, - "t": 1694171176116, - "p": 0.57 - }, - { - "x": 227, - "y": 29, - "t": 1694171176132, - "p": 0.66 - }, - { - "x": 230, - "y": 24, - "t": 1694171176149, - "p": 0.76 - }, - { - "x": 231, - "y": 20, - "t": 1694171176167, - "p": 0.72 - }, - { - "x": 229, - "y": 23, - "t": 1694171176216, - "p": 0.7 - }, - { - "x": 229, - "y": 43, - "t": 1694171176234, - "p": 0.55 - }, - { - "x": 231, - "y": 61, - "t": 1694171176249, - "p": 0.57 - }, - { - "x": 231, - "y": 76, - "t": 1694171176267, - "p": 0.61 - }, - { - "x": 230, - "y": 87, - "t": 1694171176283, - "p": 0.67 - }, - { - "x": 228, - "y": 97, - "t": 1694171176300, - "p": 0.68 - } - ], - "length": 351.94248431746627, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171176928", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 262, - "y": 33, - "t": 1694171176928, - "p": 0.1 - }, - { - "x": 255, - "y": 37, - "t": 1694171176948, - "p": 0.8 - }, - { - "x": 251, - "y": 41, - "t": 1694171176966, - "p": 0.76 - }, - { - "x": 249, - "y": 44, - "t": 1694171176982, - "p": 0.7 - }, - { - "x": 248, - "y": 48, - "t": 1694171176999, - "p": 0.72 - }, - { - "x": 252, - "y": 52, - "t": 1694171177015, - "p": 0.76 - }, - { - "x": 256, - "y": 53, - "t": 1694171177032, - "p": 0.72 - }, - { - "x": 260, - "y": 53, - "t": 1694171177049, - "p": 0.71 - }, - { - "x": 272, - "y": 54, - "t": 1694171177066, - "p": 0.65 - }, - { - "x": 291, - "y": 56, - "t": 1694171177082, - "p": 0.56 - }, - { - "x": 300, - "y": 54, - "t": 1694171177099, - "p": 0.81 - }, - { - "x": 304, - "y": 51, - "t": 1694171177115, - "p": 0.74 - }, - { - "x": 306, - "y": 48, - "t": 1694171177132, - "p": 0.7 - }, - { - "x": 304, - "y": 43, - "t": 1694171177148, - "p": 0.75 - }, - { - "x": 297, - "y": 40, - "t": 1694171177166, - "p": 0.79 - }, - { - "x": 291, - "y": 36, - "t": 1694171177181, - "p": 0.79 - }, - { - "x": 288, - "y": 35, - "t": 1694171177216, - "p": 0.68 - }, - { - "x": 285, - "y": 34, - "t": 1694171177232, - "p": 0.68 - }, - { - "x": 281, - "y": 31, - "t": 1694171177249, - "p": 0.74 - }, - { - "x": 274, - "y": 29, - "t": 1694171177266, - "p": 0.79 - }, - { - "x": 271, - "y": 29, - "t": 1694171177281, - "p": 0.68 - }, - { - "x": 265, - "y": 31, - "t": 1694171177299, - "p": 0.77 - } - ], - "length": 396.41071971359753, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171177782", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 301, - "y": 37, - "t": 1694171177782, - "p": 0.1 - }, - { - "x": 300, - "y": 42, - "t": 1694171177832, - "p": 0.75 - }, - { - "x": 306, - "y": 50, - "t": 1694171177849, - "p": 0.68 - }, - { - "x": 308, - "y": 54, - "t": 1694171177865, - "p": 0.73 - }, - { - "x": 310, - "y": 57, - "t": 1694171177881, - "p": 0.7 - }, - { - "x": 312, - "y": 60, - "t": 1694171177898, - "p": 0.7 - }, - { - "x": 312, - "y": 63, - "t": 1694171177914, - "p": 0.68 - }, - { - "x": 312, - "y": 67, - "t": 1694171177932, - "p": 0.71 - }, - { - "x": 311, - "y": 71, - "t": 1694171177947, - "p": 0.72 - }, - { - "x": 309, - "y": 76, - "t": 1694171177982, - "p": 0.75 - }, - { - "x": 305, - "y": 80, - "t": 1694171177998, - "p": 0.76 - }, - { - "x": 301, - "y": 85, - "t": 1694171178015, - "p": 0.77 - }, - { - "x": 295, - "y": 88, - "t": 1694171178031, - "p": 0.78 - }, - { - "x": 290, - "y": 90, - "t": 1694171178048, - "p": 0.75 - }, - { - "x": 284, - "y": 91, - "t": 1694171178064, - "p": 0.77 - }, - { - "x": 281, - "y": 91, - "t": 1694171178082, - "p": 0.68 - }, - { - "x": 276, - "y": 92, - "t": 1694171178097, - "p": 0.75 - }, - { - "x": 268, - "y": 92, - "t": 1694171178115, - "p": 0.8 - }, - { - "x": 261, - "y": 92, - "t": 1694171178131, - "p": 0.78 - }, - { - "x": 270, - "y": 92, - "t": 1694171178214, - "p": 0.81 - }, - { - "x": 280, - "y": 92, - "t": 1694171178218, - "p": 0.68 - } - ], - "length": 418.89121791708436, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171178666", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 351, - "y": 32, - "t": 1694171178666, - "p": 0.1 - }, - { - "x": 349, - "y": 35, - "t": 1694171178730, - "p": 0.7 - }, - { - "x": 347, - "y": 39, - "t": 1694171178748, - "p": 0.73 - }, - { - "x": 345, - "y": 42, - "t": 1694171178764, - "p": 0.7 - }, - { - "x": 343, - "y": 45, - "t": 1694171178781, - "p": 0.7 - }, - { - "x": 341, - "y": 49, - "t": 1694171178797, - "p": 0.73 - }, - { - "x": 339, - "y": 53, - "t": 1694171178815, - "p": 0.73 - }, - { - "x": 339, - "y": 56, - "t": 1694171178831, - "p": 0.68 - }, - { - "x": 343, - "y": 57, - "t": 1694171178981, - "p": 0.72 - }, - { - "x": 350, - "y": 55, - "t": 1694171178997, - "p": 0.79 - }, - { - "x": 353, - "y": 56, - "t": 1694171179015, - "p": 0.68 - }, - { - "x": 357, - "y": 56, - "t": 1694171179084, - "p": 0.71 - }, - { - "x": 362, - "y": 56, - "t": 1694171179097, - "p": 0.74 - }, - { - "x": 369, - "y": 55, - "t": 1694171179113, - "p": 0.79 - }, - { - "x": 374, - "y": 55, - "t": 1694171179131, - "p": 0.74 - }, - { - "x": 372, - "y": 60, - "t": 1694171179231, - "p": 0.75 - }, - { - "x": 370, - "y": 63, - "t": 1694171179264, - "p": 0.7 - }, - { - "x": 368, - "y": 66, - "t": 1694171179281, - "p": 0.7 - }, - { - "x": 367, - "y": 69, - "t": 1694171179298, - "p": 0.68 - }, - { - "x": 367, - "y": 72, - "t": 1694171179314, - "p": 0.68 - }, - { - "x": 367, - "y": 78, - "t": 1694171179347, - "p": 0.77 - }, - { - "x": 368, - "y": 81, - "t": 1694171179364, - "p": 0.68 - }, - { - "x": 369, - "y": 84, - "t": 1694171179381, - "p": 0.68 - } - ], - "length": 446.40839398843275, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171179854", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 388, - "y": 39, - "t": 1694171179854, - "p": 0.1 - }, - { - "x": 393, - "y": 35, - "t": 1694171179954, - "p": 0.77 - }, - { - "x": 397, - "y": 34, - "t": 1694171179970, - "p": 0.72 - }, - { - "x": 401, - "y": 33, - "t": 1694171179988, - "p": 0.72 - }, - { - "x": 403, - "y": 38, - "t": 1694171180088, - "p": 0.75 - }, - { - "x": 400, - "y": 44, - "t": 1694171180103, - "p": 0.78 - }, - { - "x": 399, - "y": 47, - "t": 1694171180121, - "p": 0.68 - }, - { - "x": 396, - "y": 49, - "t": 1694171180154, - "p": 0.7 - }, - { - "x": 400, - "y": 48, - "t": 1694171180221, - "p": 0.72 - }, - { - "x": 403, - "y": 48, - "t": 1694171180237, - "p": 0.68 - }, - { - "x": 407, - "y": 48, - "t": 1694171180270, - "p": 0.71 - }, - { - "x": 412, - "y": 49, - "t": 1694171180287, - "p": 0.75 - }, - { - "x": 415, - "y": 51, - "t": 1694171180303, - "p": 0.7 - }, - { - "x": 417, - "y": 54, - "t": 1694171180321, - "p": 0.7 - }, - { - "x": 418, - "y": 57, - "t": 1694171180353, - "p": 0.68 - }, - { - "x": 415, - "y": 62, - "t": 1694171180387, - "p": 0.76 - }, - { - "x": 412, - "y": 65, - "t": 1694171180420, - "p": 0.72 - }, - { - "x": 408, - "y": 67, - "t": 1694171180436, - "p": 0.73 - }, - { - "x": 403, - "y": 70, - "t": 1694171180453, - "p": 0.76 - }, - { - "x": 400, - "y": 71, - "t": 1694171180470, - "p": 0.68 - }, - { - "x": 397, - "y": 71, - "t": 1694171180588, - "p": 0.68 - } - ], - "length": 476.60012222966833, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/multiple-inputs/1993.json b/test/integration/strokes/multiple-inputs/1993.json deleted file mode 100644 index ceca2c6c..00000000 --- a/test/integration/strokes/multiple-inputs/1993.json +++ /dev/null @@ -1,722 +0,0 @@ -[ - { - "id": "mouse-1694173367053", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 234, - "y": 78, - "t": 1694173367053, - "p": 0.1 - }, - { - "x": 242, - "y": 70, - "t": 1694173367121, - "p": 0.66 - }, - { - "x": 253, - "y": 55, - "t": 1694173367136, - "p": 0.57 - }, - { - "x": 259, - "y": 46, - "t": 1694173367154, - "p": 0.67 - }, - { - "x": 264, - "y": 37, - "t": 1694173367171, - "p": 0.68 - }, - { - "x": 267, - "y": 28, - "t": 1694173367187, - "p": 0.82 - }, - { - "x": 267, - "y": 23, - "t": 1694173367204, - "p": 0.74 - }, - { - "x": 267, - "y": 36, - "t": 1694173367270, - "p": 0.64 - }, - { - "x": 267, - "y": 51, - "t": 1694173367286, - "p": 0.61 - }, - { - "x": 267, - "y": 64, - "t": 1694173367304, - "p": 0.64 - }, - { - "x": 268, - "y": 72, - "t": 1694173367319, - "p": 0.8 - }, - { - "x": 269, - "y": 81, - "t": 1694173367337, - "p": 0.81 - }, - { - "x": 270, - "y": 87, - "t": 1694173367353, - "p": 0.77 - }, - { - "x": 272, - "y": 90, - "t": 1694173367371, - "p": 0.7 - } - ], - "length": 379.9775148699389, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173367903", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 292, - "y": 38, - "t": 1694173367903, - "p": 0.1 - }, - { - "x": 286, - "y": 41, - "t": 1694173367937, - "p": 0.78 - }, - { - "x": 282, - "y": 46, - "t": 1694173367954, - "p": 0.77 - }, - { - "x": 280, - "y": 50, - "t": 1694173367970, - "p": 0.73 - }, - { - "x": 282, - "y": 53, - "t": 1694173368004, - "p": 0.7 - }, - { - "x": 288, - "y": 54, - "t": 1694173368019, - "p": 0.77 - }, - { - "x": 294, - "y": 54, - "t": 1694173368037, - "p": 0.77 - }, - { - "x": 299, - "y": 52, - "t": 1694173368054, - "p": 0.75 - }, - { - "x": 303, - "y": 50, - "t": 1694173368070, - "p": 0.73 - }, - { - "x": 305, - "y": 44, - "t": 1694173368120, - "p": 0.77 - }, - { - "x": 303, - "y": 39, - "t": 1694173368137, - "p": 0.75 - }, - { - "x": 301, - "y": 36, - "t": 1694173368153, - "p": 0.7 - }, - { - "x": 299, - "y": 33, - "t": 1694173368170, - "p": 0.7 - }, - { - "x": 292, - "y": 32, - "t": 1694173368204, - "p": 0.79 - }, - { - "x": 285, - "y": 32, - "t": 1694173368219, - "p": 0.78 - }, - { - "x": 282, - "y": 34, - "t": 1694173368237, - "p": 0.7 - }, - { - "x": 279, - "y": 37, - "t": 1694173368252, - "p": 0.72 - }, - { - "x": 278, - "y": 40, - "t": 1694173368286, - "p": 0.68 - }, - { - "x": 288, - "y": 40, - "t": 1694173368353, - "p": 0.68 - } - ], - "length": 391.5936604914115, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173368722", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 301, - "y": 37, - "t": 1694173368722, - "p": 0.1 - }, - { - "x": 303, - "y": 42, - "t": 1694173368771, - "p": 0.75 - }, - { - "x": 317, - "y": 54, - "t": 1694173368788, - "p": 0.57 - }, - { - "x": 327, - "y": 63, - "t": 1694173368804, - "p": 0.63 - }, - { - "x": 332, - "y": 69, - "t": 1694173368822, - "p": 0.8 - }, - { - "x": 333, - "y": 75, - "t": 1694173368837, - "p": 0.77 - }, - { - "x": 333, - "y": 78, - "t": 1694173368855, - "p": 0.68 - }, - { - "x": 334, - "y": 81, - "t": 1694173368889, - "p": 0.68 - }, - { - "x": 330, - "y": 84, - "t": 1694173368904, - "p": 0.74 - }, - { - "x": 325, - "y": 87, - "t": 1694173368921, - "p": 0.76 - }, - { - "x": 314, - "y": 93, - "t": 1694173368937, - "p": 0.65 - }, - { - "x": 303, - "y": 97, - "t": 1694173368955, - "p": 0.66 - }, - { - "x": 300, - "y": 97, - "t": 1694173368971, - "p": 0.68 - }, - { - "x": 297, - "y": 95, - "t": 1694173369022, - "p": 0.7 - } - ], - "length": 402.26989499669963, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173369439", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 345, - "y": 37, - "t": 1694173369439, - "p": 0.1 - }, - { - "x": 343, - "y": 41, - "t": 1694173369455, - "p": 0.73 - }, - { - "x": 341, - "y": 45, - "t": 1694173369488, - "p": 0.73 - }, - { - "x": 340, - "y": 48, - "t": 1694173369505, - "p": 0.68 - }, - { - "x": 344, - "y": 51, - "t": 1694173369539, - "p": 0.74 - }, - { - "x": 348, - "y": 52, - "t": 1694173369554, - "p": 0.72 - }, - { - "x": 352, - "y": 52, - "t": 1694173369571, - "p": 0.71 - }, - { - "x": 356, - "y": 51, - "t": 1694173369587, - "p": 0.72 - }, - { - "x": 360, - "y": 49, - "t": 1694173369604, - "p": 0.73 - }, - { - "x": 366, - "y": 45, - "t": 1694173369621, - "p": 0.79 - }, - { - "x": 369, - "y": 41, - "t": 1694173369638, - "p": 0.74 - }, - { - "x": 370, - "y": 38, - "t": 1694173369655, - "p": 0.68 - }, - { - "x": 368, - "y": 34, - "t": 1694173369671, - "p": 0.73 - }, - { - "x": 365, - "y": 31, - "t": 1694173369688, - "p": 0.72 - }, - { - "x": 357, - "y": 31, - "t": 1694173369704, - "p": 0.8 - }, - { - "x": 344, - "y": 33, - "t": 1694173369721, - "p": 0.64 - }, - { - "x": 335, - "y": 36, - "t": 1694173369738, - "p": 0.82 - }, - { - "x": 329, - "y": 40, - "t": 1694173369754, - "p": 0.79 - }, - { - "x": 326, - "y": 42, - "t": 1694173369787, - "p": 0.7 - }, - { - "x": 330, - "y": 44, - "t": 1694173369854, - "p": 0.73 - }, - { - "x": 338, - "y": 46, - "t": 1694173369865, - "p": 0.8 - } - ], - "length": 459.06621957468275, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173370316", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 367, - "y": 33, - "t": 1694173370316, - "p": 0.1 - }, - { - "x": 368, - "y": 36, - "t": 1694173370349, - "p": 0.68 - }, - { - "x": 370, - "y": 48, - "t": 1694173370382, - "p": 0.65 - }, - { - "x": 373, - "y": 57, - "t": 1694173370399, - "p": 0.82 - }, - { - "x": 375, - "y": 63, - "t": 1694173370415, - "p": 0.77 - }, - { - "x": 376, - "y": 69, - "t": 1694173370432, - "p": 0.77 - }, - { - "x": 378, - "y": 73, - "t": 1694173370449, - "p": 0.73 - }, - { - "x": 379, - "y": 76, - "t": 1694173370465, - "p": 0.68 - }, - { - "x": 375, - "y": 80, - "t": 1694173370548, - "p": 0.76 - }, - { - "x": 370, - "y": 82, - "t": 1694173370564, - "p": 0.75 - }, - { - "x": 360, - "y": 88, - "t": 1694173370582, - "p": 0.66 - }, - { - "x": 356, - "y": 91, - "t": 1694173370614, - "p": 0.74 - } - ], - "length": 441.04095436363826, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173371113", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 383, - "y": 36, - "t": 1694173371113, - "p": 0.1 - }, - { - "x": 386, - "y": 34, - "t": 1694173371198, - "p": 0.7 - }, - { - "x": 391, - "y": 30, - "t": 1694173371214, - "p": 0.77 - }, - { - "x": 395, - "y": 30, - "t": 1694173371231, - "p": 0.71 - }, - { - "x": 400, - "y": 29, - "t": 1694173371247, - "p": 0.75 - }, - { - "x": 405, - "y": 28, - "t": 1694173371264, - "p": 0.75 - }, - { - "x": 408, - "y": 29, - "t": 1694173371315, - "p": 0.68 - }, - { - "x": 409, - "y": 34, - "t": 1694173371331, - "p": 0.75 - }, - { - "x": 406, - "y": 38, - "t": 1694173371348, - "p": 0.74 - }, - { - "x": 401, - "y": 44, - "t": 1694173371364, - "p": 0.8 - }, - { - "x": 398, - "y": 46, - "t": 1694173371381, - "p": 0.7 - }, - { - "x": 394, - "y": 47, - "t": 1694173371398, - "p": 0.72 - }, - { - "x": 399, - "y": 47, - "t": 1694173371465, - "p": 0.74 - }, - { - "x": 402, - "y": 47, - "t": 1694173371480, - "p": 0.68 - }, - { - "x": 407, - "y": 48, - "t": 1694173371514, - "p": 0.75 - }, - { - "x": 410, - "y": 51, - "t": 1694173371531, - "p": 0.72 - }, - { - "x": 410, - "y": 58, - "t": 1694173371564, - "p": 0.78 - }, - { - "x": 408, - "y": 62, - "t": 1694173371581, - "p": 0.73 - }, - { - "x": 406, - "y": 65, - "t": 1694173371597, - "p": 0.7 - }, - { - "x": 403, - "y": 68, - "t": 1694173371614, - "p": 0.72 - }, - { - "x": 400, - "y": 70, - "t": 1694173371630, - "p": 0.7 - }, - { - "x": 397, - "y": 71, - "t": 1694173371647, - "p": 0.68 - }, - { - "x": 393, - "y": 72, - "t": 1694173371663, - "p": 0.72 - }, - { - "x": 389, - "y": 73, - "t": 1694173371681, - "p": 0.72 - } - ], - "length": 489.371132013743, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/multiple-inputs/centralProcessingUnit.json b/test/integration/strokes/multiple-inputs/centralProcessingUnit.json deleted file mode 100644 index 93fb180b..00000000 --- a/test/integration/strokes/multiple-inputs/centralProcessingUnit.json +++ /dev/null @@ -1,2102 +0,0 @@ -[ - { - "id": "mouse-1694163311260", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 54, - "y": 23, - "t": 1694163311260, - "p": 0.23 - }, - { - "x": 50, - "y": 22, - "t": 1694163311374, - "p": 0.72 - }, - { - "x": 46, - "y": 23, - "t": 1694163311425, - "p": 0.72 - }, - { - "x": 43, - "y": 25, - "t": 1694163311474, - "p": 0.7 - }, - { - "x": 40, - "y": 27, - "t": 1694163311525, - "p": 0.7 - }, - { - "x": 38, - "y": 31, - "t": 1694163311574, - "p": 0.73 - }, - { - "x": 39, - "y": 34, - "t": 1694163311608, - "p": 0.68 - }, - { - "x": 42, - "y": 36, - "t": 1694163311641, - "p": 0.7 - }, - { - "x": 45, - "y": 38, - "t": 1694163311657, - "p": 0.7 - }, - { - "x": 48, - "y": 40, - "t": 1694163311691, - "p": 0.7 - }, - { - "x": 51, - "y": 41, - "t": 1694163311725, - "p": 0.68 - }, - { - "x": 55, - "y": 42, - "t": 1694163311758, - "p": 0.72 - }, - { - "x": 58, - "y": 42, - "t": 1694163311774, - "p": 0.68 - }, - { - "x": 61, - "y": 42, - "t": 1694163311791, - "p": 0.68 - }, - { - "x": 65, - "y": 42, - "t": 1694163311824, - "p": 0.71 - }, - { - "x": 68, - "y": 41, - "t": 1694163311858, - "p": 0.68 - }, - { - "x": 71, - "y": 40, - "t": 1694163311924, - "p": 0.68 - } - ], - "length": 116.21244221316283, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163312380", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 71, - "y": 34, - "t": 1694163312380, - "p": 0.11 - }, - { - "x": 74, - "y": 33, - "t": 1694163312463, - "p": 0.68 - }, - { - "x": 77, - "y": 33, - "t": 1694163312500, - "p": 0.68 - }, - { - "x": 80, - "y": 31, - "t": 1694163312547, - "p": 0.7 - }, - { - "x": 80, - "y": 28, - "t": 1694163312581, - "p": 0.68 - }, - { - "x": 77, - "y": 26, - "t": 1694163312630, - "p": 0.7 - }, - { - "x": 74, - "y": 25, - "t": 1694163312680, - "p": 0.68 - }, - { - "x": 71, - "y": 25, - "t": 1694163312735, - "p": 0.68 - }, - { - "x": 73, - "y": 29, - "t": 1694163312797, - "p": 0.73 - }, - { - "x": 73, - "y": 32, - "t": 1694163312814, - "p": 0.68 - }, - { - "x": 72, - "y": 35, - "t": 1694163312830, - "p": 0.68 - }, - { - "x": 72, - "y": 38, - "t": 1694163312863, - "p": 0.68 - }, - { - "x": 75, - "y": 39, - "t": 1694163312896, - "p": 0.68 - }, - { - "x": 79, - "y": 39, - "t": 1694163312930, - "p": 0.71 - }, - { - "x": 82, - "y": 38, - "t": 1694163312963, - "p": 0.68 - }, - { - "x": 86, - "y": 37, - "t": 1694163313012, - "p": 0.72 - }, - { - "x": 90, - "y": 37, - "t": 1694163313046, - "p": 0.71 - } - ], - "length": 133.33875884845978, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163313336", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 93, - "y": 29, - "t": 1694163313336, - "p": 0.1 - }, - { - "x": 93, - "y": 33, - "t": 1694163313379, - "p": 0.71 - }, - { - "x": 93, - "y": 37, - "t": 1694163313412, - "p": 0.71 - }, - { - "x": 94, - "y": 34, - "t": 1694163313663, - "p": 0.68 - }, - { - "x": 97, - "y": 30, - "t": 1694163313696, - "p": 0.74 - }, - { - "x": 100, - "y": 28, - "t": 1694163313746, - "p": 0.7 - }, - { - "x": 103, - "y": 31, - "t": 1694163313845, - "p": 0.72 - }, - { - "x": 106, - "y": 35, - "t": 1694163313879, - "p": 0.74 - }, - { - "x": 107, - "y": 39, - "t": 1694163313912, - "p": 0.72 - }, - { - "x": 108, - "y": 42, - "t": 1694163313946, - "p": 0.68 - } - ], - "length": 133.71248393219813, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163314496", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 115, - "y": 13, - "t": 1694163314496, - "p": 0.1 - }, - { - "x": 113, - "y": 18, - "t": 1694163314553, - "p": 0.75 - }, - { - "x": 114, - "y": 21, - "t": 1694163314569, - "p": 0.68 - }, - { - "x": 116, - "y": 25, - "t": 1694163314587, - "p": 0.73 - }, - { - "x": 116, - "y": 28, - "t": 1694163314603, - "p": 0.68 - }, - { - "x": 118, - "y": 34, - "t": 1694163314636, - "p": 0.77 - }, - { - "x": 120, - "y": 37, - "t": 1694163314653, - "p": 0.7 - } - ], - "length": 141.6821350915377, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163315457", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 115, - "y": 26, - "t": 1694163315457, - "p": 0.1 - }, - { - "x": 118, - "y": 24, - "t": 1694163315509, - "p": 0.7 - }, - { - "x": 121, - "y": 23, - "t": 1694163315557, - "p": 0.68 - }, - { - "x": 124, - "y": 23, - "t": 1694163315590, - "p": 0.68 - }, - { - "x": 127, - "y": 22, - "t": 1694163315624, - "p": 0.68 - } - ], - "length": 130.83260868969188, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163316181", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 130, - "y": 38, - "t": 1694163316181, - "p": 0.1 - }, - { - "x": 131, - "y": 34, - "t": 1694163316280, - "p": 0.72 - }, - { - "x": 131, - "y": 30, - "t": 1694163316314, - "p": 0.71 - }, - { - "x": 133, - "y": 27, - "t": 1694163316347, - "p": 0.7 - }, - { - "x": 136, - "y": 26, - "t": 1694163316396, - "p": 0.68 - }, - { - "x": 139, - "y": 26, - "t": 1694163316446, - "p": 0.68 - } - ], - "length": 153.33095818794612, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163316764", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 150, - "y": 30, - "t": 1694163316764, - "p": 0.1 - }, - { - "x": 149, - "y": 33, - "t": 1694163316829, - "p": 0.68 - }, - { - "x": 153, - "y": 35, - "t": 1694163316913, - "p": 0.73 - }, - { - "x": 157, - "y": 35, - "t": 1694163316946, - "p": 0.71 - }, - { - "x": 160, - "y": 34, - "t": 1694163316996, - "p": 0.68 - }, - { - "x": 165, - "y": 31, - "t": 1694163317029, - "p": 0.76 - }, - { - "x": 166, - "y": 28, - "t": 1694163317079, - "p": 0.68 - }, - { - "x": 163, - "y": 27, - "t": 1694163317096, - "p": 0.68 - }, - { - "x": 159, - "y": 26, - "t": 1694163317112, - "p": 0.72 - }, - { - "x": 156, - "y": 25, - "t": 1694163317129, - "p": 0.68 - }, - { - "x": 153, - "y": 25, - "t": 1694163317173, - "p": 0.68 - }, - { - "x": 148, - "y": 26, - "t": 1694163317213, - "p": 0.75 - }, - { - "x": 144, - "y": 27, - "t": 1694163317246, - "p": 0.72 - }, - { - "x": 147, - "y": 27, - "t": 1694163317329, - "p": 0.68 - }, - { - "x": 148, - "y": 30, - "t": 1694163317412, - "p": 0.68 - } - ], - "length": 205.59256998346675, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163317800", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 169, - "y": 26, - "t": 1694163317800, - "p": 0.1 - }, - { - "x": 171, - "y": 29, - "t": 1694163317884, - "p": 0.7 - }, - { - "x": 172, - "y": 33, - "t": 1694163317901, - "p": 0.72 - }, - { - "x": 173, - "y": 37, - "t": 1694163317934, - "p": 0.72 - }, - { - "x": 173, - "y": 40, - "t": 1694163317983, - "p": 0.68 - } - ], - "length": 185.84006622025606, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163318516", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 184, - "y": 12, - "t": 1694163318516, - "p": 0.1 - }, - { - "x": 184, - "y": 15, - "t": 1694163318549, - "p": 0.68 - }, - { - "x": 183, - "y": 21, - "t": 1694163318583, - "p": 0.77 - }, - { - "x": 182, - "y": 25, - "t": 1694163318599, - "p": 0.72 - }, - { - "x": 182, - "y": 28, - "t": 1694163318616, - "p": 0.68 - }, - { - "x": 182, - "y": 32, - "t": 1694163318632, - "p": 0.71 - }, - { - "x": 182, - "y": 35, - "t": 1694163318649, - "p": 0.68 - } - ], - "length": 207.59675730177364, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163322030", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 39, - "y": 81, - "t": 1694163322030, - "p": 0.1 - }, - { - "x": 39, - "y": 84, - "t": 1694163322064, - "p": 0.68 - }, - { - "x": 40, - "y": 88, - "t": 1694163322080, - "p": 0.72 - }, - { - "x": 40, - "y": 92, - "t": 1694163322097, - "p": 0.71 - }, - { - "x": 40, - "y": 96, - "t": 1694163322113, - "p": 0.71 - }, - { - "x": 40, - "y": 100, - "t": 1694163322130, - "p": 0.71 - }, - { - "x": 38, - "y": 95, - "t": 1694163322246, - "p": 0.75 - }, - { - "x": 38, - "y": 90, - "t": 1694163322264, - "p": 0.74 - }, - { - "x": 39, - "y": 87, - "t": 1694163322280, - "p": 0.68 - }, - { - "x": 41, - "y": 83, - "t": 1694163322297, - "p": 0.73 - }, - { - "x": 44, - "y": 79, - "t": 1694163322313, - "p": 0.74 - }, - { - "x": 45, - "y": 76, - "t": 1694163322330, - "p": 0.68 - }, - { - "x": 48, - "y": 74, - "t": 1694163322380, - "p": 0.7 - }, - { - "x": 51, - "y": 74, - "t": 1694163322413, - "p": 0.68 - }, - { - "x": 55, - "y": 75, - "t": 1694163322446, - "p": 0.72 - }, - { - "x": 56, - "y": 79, - "t": 1694163322496, - "p": 0.72 - }, - { - "x": 54, - "y": 83, - "t": 1694163322514, - "p": 0.73 - }, - { - "x": 51, - "y": 84, - "t": 1694163322547, - "p": 0.68 - }, - { - "x": 48, - "y": 87, - "t": 1694163322581, - "p": 0.72 - }, - { - "x": 43, - "y": 88, - "t": 1694163322647, - "p": 0.75 - }, - { - "x": 39, - "y": 87, - "t": 1694163322663, - "p": 0.72 - }, - { - "x": 47, - "y": 85, - "t": 1694163322729, - "p": 0.8 - }, - { - "x": 50, - "y": 84, - "t": 1694163322732, - "p": 0.68 - } - ], - "length": 182.56433697031935, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163322998", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 63, - "y": 86, - "t": 1694163322998, - "p": 0.1 - }, - { - "x": 62, - "y": 83, - "t": 1694163323079, - "p": 0.68 - }, - { - "x": 61, - "y": 80, - "t": 1694163323096, - "p": 0.68 - }, - { - "x": 63, - "y": 77, - "t": 1694163323129, - "p": 0.7 - }, - { - "x": 67, - "y": 74, - "t": 1694163323162, - "p": 0.74 - }, - { - "x": 71, - "y": 72, - "t": 1694163323195, - "p": 0.73 - } - ], - "length": 126.0089965582271, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163323500", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 75, - "y": 77, - "t": 1694163323500, - "p": 0.1 - }, - { - "x": 72, - "y": 79, - "t": 1694163323529, - "p": 0.7 - }, - { - "x": 74, - "y": 82, - "t": 1694163323596, - "p": 0.7 - }, - { - "x": 77, - "y": 84, - "t": 1694163323646, - "p": 0.7 - }, - { - "x": 80, - "y": 83, - "t": 1694163323695, - "p": 0.68 - }, - { - "x": 84, - "y": 81, - "t": 1694163323713, - "p": 0.73 - }, - { - "x": 88, - "y": 78, - "t": 1694163323746, - "p": 0.74 - }, - { - "x": 89, - "y": 75, - "t": 1694163323795, - "p": 0.68 - }, - { - "x": 87, - "y": 72, - "t": 1694163323828, - "p": 0.7 - }, - { - "x": 82, - "y": 71, - "t": 1694163323862, - "p": 0.75 - }, - { - "x": 78, - "y": 71, - "t": 1694163323879, - "p": 0.71 - }, - { - "x": 75, - "y": 71, - "t": 1694163323895, - "p": 0.68 - } - ], - "length": 149.80745026506733, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163324485", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 108, - "y": 69, - "t": 1694163324485, - "p": 0.1 - }, - { - "x": 105, - "y": 69, - "t": 1694163324534, - "p": 0.68 - }, - { - "x": 102, - "y": 70, - "t": 1694163324551, - "p": 0.68 - }, - { - "x": 99, - "y": 72, - "t": 1694163324584, - "p": 0.7 - }, - { - "x": 95, - "y": 74, - "t": 1694163324618, - "p": 0.73 - }, - { - "x": 93, - "y": 77, - "t": 1694163324659, - "p": 0.7 - }, - { - "x": 97, - "y": 78, - "t": 1694163324700, - "p": 0.72 - }, - { - "x": 102, - "y": 79, - "t": 1694163324733, - "p": 0.75 - }, - { - "x": 107, - "y": 79, - "t": 1694163324751, - "p": 0.74 - }, - { - "x": 111, - "y": 79, - "t": 1694163324767, - "p": 0.71 - }, - { - "x": 114, - "y": 80, - "t": 1694163324818, - "p": 0.68 - }, - { - "x": 117, - "y": 80, - "t": 1694163324911, - "p": 0.68 - } - ], - "length": 170.3899751452377, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163325110", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 119, - "y": 76, - "t": 1694163325110, - "p": 0.1 - }, - { - "x": 122, - "y": 76, - "t": 1694163325167, - "p": 0.68 - }, - { - "x": 126, - "y": 76, - "t": 1694163325183, - "p": 0.71 - }, - { - "x": 129, - "y": 76, - "t": 1694163325217, - "p": 0.68 - }, - { - "x": 132, - "y": 73, - "t": 1694163325266, - "p": 0.72 - }, - { - "x": 131, - "y": 70, - "t": 1694163325317, - "p": 0.68 - }, - { - "x": 128, - "y": 70, - "t": 1694163325333, - "p": 0.68 - }, - { - "x": 125, - "y": 70, - "t": 1694163325351, - "p": 0.68 - }, - { - "x": 122, - "y": 73, - "t": 1694163325417, - "p": 0.72 - }, - { - "x": 122, - "y": 76, - "t": 1694163325450, - "p": 0.68 - }, - { - "x": 126, - "y": 79, - "t": 1694163325500, - "p": 0.74 - }, - { - "x": 131, - "y": 80, - "t": 1694163325516, - "p": 0.75 - }, - { - "x": 135, - "y": 81, - "t": 1694163325533, - "p": 0.72 - }, - { - "x": 139, - "y": 80, - "t": 1694163325567, - "p": 0.72 - }, - { - "x": 142, - "y": 79, - "t": 1694163325649, - "p": 0.68 - } - ], - "length": 193.35350937715265, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163325922", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 150, - "y": 69, - "t": 1694163325922, - "p": 0.1 - }, - { - "x": 146, - "y": 71, - "t": 1694163326066, - "p": 0.73 - }, - { - "x": 143, - "y": 72, - "t": 1694163326082, - "p": 0.68 - }, - { - "x": 146, - "y": 72, - "t": 1694163326133, - "p": 0.68 - }, - { - "x": 149, - "y": 73, - "t": 1694163326149, - "p": 0.68 - }, - { - "x": 152, - "y": 75, - "t": 1694163326200, - "p": 0.7 - }, - { - "x": 154, - "y": 78, - "t": 1694163326249, - "p": 0.7 - }, - { - "x": 156, - "y": 81, - "t": 1694163326300, - "p": 0.7 - }, - { - "x": 153, - "y": 84, - "t": 1694163326366, - "p": 0.72 - }, - { - "x": 148, - "y": 85, - "t": 1694163326433, - "p": 0.75 - }, - { - "x": 145, - "y": 85, - "t": 1694163326449, - "p": 0.68 - }, - { - "x": 142, - "y": 85, - "t": 1694163326466, - "p": 0.68 - }, - { - "x": 139, - "y": 85, - "t": 1694163326483, - "p": 0.68 - }, - { - "x": 145, - "y": 83, - "t": 1694163326549, - "p": 0.77 - }, - { - "x": 152, - "y": 83, - "t": 1694163326566, - "p": 0.78 - }, - { - "x": 155, - "y": 81, - "t": 1694163326590, - "p": 0.7 - } - ], - "length": 224.99416676804532, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163326906", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 170, - "y": 70, - "t": 1694163326906, - "p": 0.1 - }, - { - "x": 166, - "y": 71, - "t": 1694163327040, - "p": 0.72 - }, - { - "x": 162, - "y": 73, - "t": 1694163327074, - "p": 0.73 - }, - { - "x": 166, - "y": 76, - "t": 1694163327190, - "p": 0.74 - }, - { - "x": 169, - "y": 77, - "t": 1694163327206, - "p": 0.68 - }, - { - "x": 172, - "y": 78, - "t": 1694163327256, - "p": 0.68 - }, - { - "x": 171, - "y": 81, - "t": 1694163327324, - "p": 0.68 - }, - { - "x": 167, - "y": 83, - "t": 1694163327356, - "p": 0.73 - }, - { - "x": 164, - "y": 84, - "t": 1694163327372, - "p": 0.68 - }, - { - "x": 161, - "y": 86, - "t": 1694163327389, - "p": 0.7 - }, - { - "x": 158, - "y": 86, - "t": 1694163327405, - "p": 0.68 - }, - { - "x": 155, - "y": 86, - "t": 1694163327472, - "p": 0.68 - }, - { - "x": 152, - "y": 85, - "t": 1694163327506, - "p": 0.68 - }, - { - "x": 156, - "y": 84, - "t": 1694163327567, - "p": 0.72 - } - ], - "length": 231.45518584604267, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163328034", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 179, - "y": 69, - "t": 1694163328034, - "p": 0.1 - }, - { - "x": 179, - "y": 72, - "t": 1694163328135, - "p": 0.68 - }, - { - "x": 179, - "y": 75, - "t": 1694163328151, - "p": 0.68 - }, - { - "x": 179, - "y": 79, - "t": 1694163328168, - "p": 0.71 - }, - { - "x": 178, - "y": 83, - "t": 1694163328184, - "p": 0.72 - }, - { - "x": 176, - "y": 86, - "t": 1694163328218, - "p": 0.7 - } - ], - "length": 209.56713062311687, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163328646", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 183, - "y": 60, - "t": 1694163328646, - "p": 0.1 - } - ], - "length": 192.5850461484484, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163329046", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 187, - "y": 73, - "t": 1694163329046, - "p": 0.1 - }, - { - "x": 188, - "y": 76, - "t": 1694163329095, - "p": 0.68 - }, - { - "x": 188, - "y": 81, - "t": 1694163329129, - "p": 0.74 - }, - { - "x": 188, - "y": 84, - "t": 1694163329162, - "p": 0.68 - }, - { - "x": 188, - "y": 80, - "t": 1694163329263, - "p": 0.71 - }, - { - "x": 189, - "y": 76, - "t": 1694163329296, - "p": 0.72 - }, - { - "x": 193, - "y": 73, - "t": 1694163329329, - "p": 0.74 - }, - { - "x": 195, - "y": 77, - "t": 1694163329462, - "p": 0.73 - }, - { - "x": 196, - "y": 81, - "t": 1694163329480, - "p": 0.72 - }, - { - "x": 196, - "y": 84, - "t": 1694163329513, - "p": 0.68 - }, - { - "x": 199, - "y": 83, - "t": 1694163329529, - "p": 0.68 - } - ], - "length": 239.78652010880012, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163329900", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 217, - "y": 74, - "t": 1694163329900, - "p": 0.1 - }, - { - "x": 213, - "y": 76, - "t": 1694163329945, - "p": 0.73 - }, - { - "x": 219, - "y": 79, - "t": 1694163330028, - "p": 0.78 - }, - { - "x": 222, - "y": 78, - "t": 1694163330099, - "p": 0.68 - }, - { - "x": 226, - "y": 75, - "t": 1694163330145, - "p": 0.74 - }, - { - "x": 226, - "y": 72, - "t": 1694163330178, - "p": 0.68 - }, - { - "x": 219, - "y": 70, - "t": 1694163330211, - "p": 0.79 - }, - { - "x": 211, - "y": 71, - "t": 1694163330228, - "p": 0.8 - }, - { - "x": 214, - "y": 73, - "t": 1694163330295, - "p": 0.7 - }, - { - "x": 214, - "y": 76, - "t": 1694163330345, - "p": 0.68 - }, - { - "x": 217, - "y": 76, - "t": 1694163330373, - "p": 0.68 - } - ], - "length": 276.56111896095183, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163330664", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 226, - "y": 70, - "t": 1694163330664, - "p": 0.1 - }, - { - "x": 230, - "y": 73, - "t": 1694163330711, - "p": 0.74 - }, - { - "x": 230, - "y": 77, - "t": 1694163330727, - "p": 0.71 - }, - { - "x": 231, - "y": 82, - "t": 1694163330744, - "p": 0.75 - }, - { - "x": 232, - "y": 85, - "t": 1694163330778, - "p": 0.68 - }, - { - "x": 234, - "y": 88, - "t": 1694163330811, - "p": 0.7 - }, - { - "x": 235, - "y": 91, - "t": 1694163330844, - "p": 0.68 - }, - { - "x": 230, - "y": 94, - "t": 1694163330911, - "p": 0.76 - }, - { - "x": 225, - "y": 94, - "t": 1694163330927, - "p": 0.74 - }, - { - "x": 221, - "y": 94, - "t": 1694163330944, - "p": 0.71 - }, - { - "x": 218, - "y": 94, - "t": 1694163330960, - "p": 0.68 - }, - { - "x": 215, - "y": 94, - "t": 1694163331026, - "p": 0.68 - }, - { - "x": 212, - "y": 96, - "t": 1694163331061, - "p": 0.7 - }, - { - "x": 215, - "y": 98, - "t": 1694163331095, - "p": 0.7 - } - ], - "length": 288.66365718956877, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163331708", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 318, - "y": 72, - "t": 1694163331708, - "p": 0.1 - }, - { - "x": 318, - "y": 76, - "t": 1694163331808, - "p": 0.71 - }, - { - "x": 318, - "y": 79, - "t": 1694163331825, - "p": 0.68 - }, - { - "x": 318, - "y": 82, - "t": 1694163331842, - "p": 0.68 - }, - { - "x": 322, - "y": 83, - "t": 1694163331875, - "p": 0.72 - }, - { - "x": 325, - "y": 83, - "t": 1694163331891, - "p": 0.68 - }, - { - "x": 331, - "y": 80, - "t": 1694163331924, - "p": 0.78 - }, - { - "x": 337, - "y": 77, - "t": 1694163331942, - "p": 0.78 - }, - { - "x": 342, - "y": 74, - "t": 1694163331958, - "p": 0.76 - }, - { - "x": 345, - "y": 70, - "t": 1694163331975, - "p": 0.74 - }, - { - "x": 345, - "y": 74, - "t": 1694163332108, - "p": 0.71 - }, - { - "x": 345, - "y": 78, - "t": 1694163332125, - "p": 0.71 - }, - { - "x": 344, - "y": 83, - "t": 1694163332141, - "p": 0.75 - }, - { - "x": 343, - "y": 88, - "t": 1694163332158, - "p": 0.75 - } - ], - "length": 385.6175804732919, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163332550", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 355, - "y": 82, - "t": 1694163332550, - "p": 0.1 - }, - { - "x": 356, - "y": 85, - "t": 1694163332624, - "p": 0.68 - }, - { - "x": 355, - "y": 81, - "t": 1694163332741, - "p": 0.72 - }, - { - "x": 355, - "y": 77, - "t": 1694163332757, - "p": 0.71 - }, - { - "x": 358, - "y": 73, - "t": 1694163332790, - "p": 0.74 - }, - { - "x": 363, - "y": 72, - "t": 1694163332823, - "p": 0.75 - }, - { - "x": 365, - "y": 77, - "t": 1694163332890, - "p": 0.75 - }, - { - "x": 366, - "y": 80, - "t": 1694163332908, - "p": 0.68 - }, - { - "x": 367, - "y": 83, - "t": 1694163332941, - "p": 0.68 - }, - { - "x": 366, - "y": 86, - "t": 1694163333008, - "p": 0.68 - } - ], - "length": 400.60376231755174, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163333501", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 377, - "y": 70, - "t": 1694163333501, - "p": 0.1 - }, - { - "x": 380, - "y": 73, - "t": 1694163333550, - "p": 0.72 - }, - { - "x": 379, - "y": 78, - "t": 1694163333583, - "p": 0.75 - }, - { - "x": 379, - "y": 81, - "t": 1694163333617, - "p": 0.68 - }, - { - "x": 378, - "y": 84, - "t": 1694163333750, - "p": 0.68 - } - ], - "length": 398.94754518795537, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163334262", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 380, - "y": 58, - "t": 1694163334262, - "p": 0.1 - } - ], - "length": 384.4008324652797, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163334845", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 395, - "y": 46, - "t": 1694163334845, - "p": 0.1 - }, - { - "x": 396, - "y": 50, - "t": 1694163334894, - "p": 0.72 - }, - { - "x": 396, - "y": 53, - "t": 1694163334911, - "p": 0.68 - }, - { - "x": 396, - "y": 57, - "t": 1694163334927, - "p": 0.71 - }, - { - "x": 395, - "y": 61, - "t": 1694163334944, - "p": 0.72 - }, - { - "x": 392, - "y": 65, - "t": 1694163334961, - "p": 0.74 - }, - { - "x": 391, - "y": 69, - "t": 1694163334978, - "p": 0.72 - }, - { - "x": 389, - "y": 72, - "t": 1694163335011, - "p": 0.7 - }, - { - "x": 387, - "y": 75, - "t": 1694163335261, - "p": 0.7 - }, - { - "x": 385, - "y": 78, - "t": 1694163335294, - "p": 0.7 - } - ], - "length": 432.85543143665353, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694163335810", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 392, - "y": 65, - "t": 1694163335810, - "p": 0.1 - }, - { - "x": 395, - "y": 64, - "t": 1694163335893, - "p": 0.68 - }, - { - "x": 398, - "y": 63, - "t": 1694163335910, - "p": 0.68 - }, - { - "x": 402, - "y": 63, - "t": 1694163335926, - "p": 0.71 - }, - { - "x": 406, - "y": 63, - "t": 1694163335943, - "p": 0.71 - }, - { - "x": 409, - "y": 63, - "t": 1694163335993, - "p": 0.68 - }, - { - "x": 412, - "y": 63, - "t": 1694163336026, - "p": 0.68 - }, - { - "x": 415, - "y": 62, - "t": 1694163336060, - "p": 0.68 - } - ], - "length": 420.8393213331013, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/one.json b/test/integration/strokes/one.json deleted file mode 100644 index 96bc1cd8..00000000 --- a/test/integration/strokes/one.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "x": [ - 370, - 374, - 377, - 381, - 384, - 387, - 390, - 391, - 392, - 394, - 394, - 395, - 395, - 395, - 395, - 395 - ], - "y": [ - 162, - 159, - 156, - 153, - 148, - 143, - 137, - 134, - 131, - 137, - 144, - 150, - 155, - 161, - 169, - 172 - ], - "t": [ - 1666856200392, - 1666856200543, - 1666856200559, - 1666856200576, - 1666856200592, - 1666856200608, - 1666856200625, - 1666856200642, - 1666856200675, - 1666856200759, - 1666856200776, - 1666856200792, - 1666856200809, - 1666856200825, - 1666856200842, - 1666856201008 - ] - }, - { - "x": [ - 383, - 387, - 390, - 393, - 396, - 400, - 405, - 409, - 413 - ], - "y": [ - 177, - 176, - 174, - 173, - 171, - 168, - 165, - 164, - 161 - ], - "t": [ - 1666856201226, - 1666856201442, - 1666856201459, - 1666856201475, - 1666856201493, - 1666856201509, - 1666856201525, - 1666856201559, - 1666856201593 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/ponyErase.json b/test/integration/strokes/ponyErase.json deleted file mode 100644 index 2a3c6cc9..00000000 --- a/test/integration/strokes/ponyErase.json +++ /dev/null @@ -1,434 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 228, - 233, - 237, - 244, - 250, - 254, - 257, - 258, - 259, - 258, - 257, - 254, - 253, - 252, - 252, - 252, - 253, - 254, - 251, - 250, - 249, - 248, - 249, - 250, - 251, - 254, - 257, - 259, - 261, - 262, - 265, - 268, - 273, - 277, - 277, - 274, - 278, - 281, - 284, - 291, - 293, - 294, - 290, - 286, - 280, - 274, - 273, - 278, - 283, - 286, - 289, - 292, - 296, - 299, - 303, - 306, - 310, - 313, - 315, - 316, - 317, - 317, - 317, - 318, - 321, - 323, - 325, - 327, - 329, - 330, - 333, - 336, - 341, - 345, - 345, - 342, - 344, - 346, - 347, - 347, - 351, - 354, - 357, - 360, - 361, - 365, - 367, - 372, - 375, - 377, - 377, - 375, - 372, - 367, - 365, - 366, - 369, - 374, - 379, - 384, - 388 - ], - "y": [ - 353, - 348, - 345, - 340, - 335, - 331, - 327, - 324, - 321, - 330, - 337, - 345, - 352, - 360, - 367, - 372, - 376, - 379, - 375, - 370, - 364, - 354, - 350, - 347, - 344, - 341, - 345, - 348, - 351, - 354, - 355, - 355, - 354, - 351, - 348, - 354, - 357, - 358, - 359, - 358, - 355, - 350, - 347, - 347, - 345, - 344, - 347, - 349, - 350, - 350, - 348, - 348, - 346, - 344, - 339, - 337, - 338, - 342, - 346, - 350, - 353, - 356, - 353, - 349, - 345, - 342, - 345, - 348, - 352, - 356, - 356, - 353, - 349, - 345, - 342, - 340, - 343, - 348, - 351, - 354, - 353, - 351, - 347, - 343, - 346, - 351, - 354, - 358, - 362, - 365, - 369, - 373, - 374, - 370, - 366, - 362, - 357, - 350, - 345, - 342, - 341 - ], - "t": [ - 1691671459764, - 1691671459821, - 1691671459837, - 1691671459854, - 1691671459871, - 1691671459888, - 1691671459904, - 1691671459921, - 1691671459954, - 1691671460037, - 1691671460054, - 1691671460070, - 1691671460087, - 1691671460104, - 1691671460120, - 1691671460137, - 1691671460154, - 1691671460170, - 1691671460304, - 1691671460320, - 1691671460337, - 1691671460370, - 1691671460387, - 1691671460420, - 1691671460437, - 1691671460470, - 1691671460687, - 1691671460704, - 1691671460720, - 1691671460737, - 1691671460754, - 1691671460787, - 1691671460837, - 1691671460870, - 1691671460903, - 1691671461004, - 1691671461037, - 1691671461053, - 1691671461070, - 1691671461087, - 1691671461153, - 1691671461186, - 1691671461219, - 1691671461236, - 1691671461253, - 1691671461269, - 1691671461369, - 1691671461436, - 1691671461453, - 1691671461470, - 1691671461503, - 1691671461519, - 1691671461552, - 1691671461586, - 1691671461619, - 1691671461653, - 1691671461786, - 1691671461803, - 1691671461819, - 1691671461836, - 1691671461853, - 1691671461869, - 1691671462169, - 1691671462202, - 1691671462236, - 1691671462269, - 1691671462419, - 1691671462435, - 1691671462468, - 1691671462503, - 1691671462569, - 1691671462619, - 1691671462668, - 1691671462702, - 1691671462752, - 1691671463021, - 1691671463385, - 1691671463418, - 1691671463468, - 1691671463551, - 1691671463634, - 1691671463734, - 1691671463784, - 1691671463818, - 1691671464101, - 1691671464117, - 1691671464134, - 1691671464167, - 1691671464184, - 1691671464201, - 1691671464217, - 1691671464267, - 1691671464334, - 1691671464351, - 1691671464367, - 1691671464384, - 1691671464400, - 1691671464417, - 1691671464434, - 1691671464450, - 1691671464467 - ], - "p": [ - 0.5, - 0.73, - 0.74, - 0.81, - 0.8, - 0.76, - 0.74, - 0.68, - 0.68, - 0.81, - 0.79, - 0.81, - 0.79, - 0.8, - 0.78, - 0.74, - 0.72, - 0.68, - 0.74, - 0.75, - 0.77, - 0.68, - 0.72, - 0.68, - 0.68, - 0.72, - 0.74, - 0.7, - 0.7, - 0.68, - 0.68, - 0.68, - 0.75, - 0.74, - 0.68, - 0.78, - 0.74, - 0.68, - 0.68, - 0.79, - 0.7, - 0.75, - 0.74, - 0.71, - 0.77, - 0.77, - 0.68, - 0.75, - 0.75, - 0.68, - 0.7, - 0.68, - 0.73, - 0.7, - 0.77, - 0.7, - 0.72, - 0.74, - 0.73, - 0.72, - 0.68, - 0.68, - 0.68, - 0.72, - 0.74, - 0.7, - 0.7, - 0.7, - 0.73, - 0.72, - 0.68, - 0.72, - 0.77, - 0.76, - 0.68, - 0.7, - 0.7, - 0.75, - 0.68, - 0.68, - 0.72, - 0.7, - 0.74, - 0.74, - 0.68, - 0.77, - 0.7, - 0.77, - 0.74, - 0.7, - 0.71, - 0.73, - 0.68, - 0.77, - 0.73, - 0.72, - 0.76, - 0.81, - 0.79, - 0.76, - 0.72 - ] - }, - { - "pointerType": "eraser", - "pointerId": 0, - "x": [ - 231 - ], - "y": [ - 350 - ], - "t": [ - 1691671470393 - ], - "p": [ - 0.5 - ] - } -] diff --git a/test/integration/strokes/rectangle.json b/test/integration/strokes/rectangle.json deleted file mode 100644 index 2146db1b..00000000 --- a/test/integration/strokes/rectangle.json +++ /dev/null @@ -1,338 +0,0 @@ -[ - { - "p": [ - 0.5, - 0.83, - 0.71, - 0.74, - 0.74, - 0.78, - 0.79, - 0.78, - 0.71, - 0.71, - 0.71, - 0.75, - 0.68, - 0.68, - 0.71, - 0.68, - 0.68, - 0.71 - ], - "t": [ - 1688461352900, - 1688461352959, - 1688461352975, - 1688461352991, - 1688461353008, - 1688461353025, - 1688461353042, - 1688461353058, - 1688461353075, - 1688461353091, - 1688461353108, - 1688461353124, - 1688461353142, - 1688461353159, - 1688461353175, - 1688461353191, - 1688461353317, - 1688461353425 - ], - "x": [ - 217, - 217, - 217, - 217, - 217, - 217, - 216, - 216, - 216, - 216, - 216, - 215, - 215, - 215, - 215, - 214, - 214, - 214 - ], - "y": [ - 197, - 200, - 204, - 209, - 214, - 221, - 228, - 235, - 239, - 243, - 247, - 252, - 255, - 258, - 262, - 265, - 268, - 272 - ] - }, - { - "p": [ - 0.5, - 0.82, - 0.8, - 0.61, - 0.51, - 0.67, - 0.78, - 0.68, - 0.68, - 0.68, - 0.74, - 0.75, - 0.71, - 0.68, - 0.71, - 0.68, - 0.71, - 0.68, - 0.75, - 0.71, - 0.7, - 0.71, - 0.77, - 0.68, - 0.71, - 0.71, - 0.79, - 0.8, - 0.71, - 0.77, - 0.72, - 0.68, - 0.68, - 0.68, - 0.68, - 0.74, - 0.68, - 0.68, - 0.68, - 0.7, - 0.8, - 0.64, - 0.65, - 0.67, - 0.77, - 0.68, - 0.68, - 0.74, - 0.8, - 0.78, - 0.74, - 0.68, - 0.68, - 0.74, - 0.74, - 0.71, - 0.77, - 0.71, - 0.72, - 0.73, - 0.68 - ], - "t": [ - 1688461354290, - 1688461354376, - 1688461354393, - 1688461354409, - 1688461354426, - 1688461354442, - 1688461354459, - 1688461354475, - 1688461354493, - 1688461354509, - 1688461354543, - 1688461354559, - 1688461354576, - 1688461354592, - 1688461354609, - 1688461354642, - 1688461354659, - 1688461354693, - 1688461354776, - 1688461354792, - 1688461354826, - 1688461354876, - 1688461354977, - 1688461354993, - 1688461355010, - 1688461355026, - 1688461355043, - 1688461355059, - 1688461355076, - 1688461355093, - 1688461355109, - 1688461355126, - 1688461355143, - 1688461355177, - 1688461355193, - 1688461355226, - 1688461355243, - 1688461355277, - 1688461355530, - 1688461355578, - 1688461355626, - 1688461355644, - 1688461355661, - 1688461355677, - 1688461355694, - 1688461355710, - 1688461355727, - 1688461355744, - 1688461355760, - 1688461355777, - 1688461355794, - 1688461355811, - 1688461355828, - 1688461355860, - 1688461355878, - 1688461355894, - 1688461355910, - 1688461355927, - 1688461356127, - 1688461356144, - 1688461356177 - ], - "x": [ - 219, - 222, - 230, - 245, - 269, - 280, - 287, - 290, - 293, - 296, - 301, - 306, - 310, - 313, - 317, - 320, - 324, - 327, - 332, - 336, - 339, - 343, - 342, - 341, - 341, - 341, - 340, - 339, - 339, - 339, - 338, - 338, - 337, - 337, - 336, - 336, - 336, - 336, - 336, - 333, - 325, - 312, - 300, - 289, - 283, - 280, - 277, - 272, - 264, - 257, - 252, - 249, - 246, - 241, - 236, - 232, - 226, - 222, - 218, - 214, - 211 - ], - "y": [ - 195, - 196, - 197, - 197, - 200, - 200, - 200, - 200, - 200, - 200, - 200, - 201, - 201, - 201, - 201, - 201, - 201, - 201, - 200, - 200, - 198, - 198, - 204, - 207, - 211, - 215, - 222, - 230, - 234, - 240, - 244, - 247, - 250, - 253, - 256, - 261, - 264, - 267, - 270, - 272, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 269, - 270, - 270, - 270, - 270, - 270, - 270, - 271, - 269, - 270 - ] - } -] diff --git a/test/integration/strokes/sum.json b/test/integration/strokes/sum.json deleted file mode 100644 index 0665372a..00000000 --- a/test/integration/strokes/sum.json +++ /dev/null @@ -1,330 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 255, - 259, - 263, - 268, - 271, - 275, - 279, - 283, - 286, - 286, - 284, - 280, - 276, - 281, - 286, - 296, - 299, - 298, - 294, - 290, - 285, - 281, - 276, - 271, - 265, - 258 - ], - "y": [ - 223, - 221, - 219, - 215, - 214, - 215, - 217, - 220, - 221, - 224, - 230, - 234, - 236, - 236, - 236, - 236, - 236, - 239, - 243, - 247, - 249, - 251, - 254, - 255, - 256, - 258 - ], - "t": [ - 1689748306049, - 1689748306129, - 1689748306146, - 1689748306178, - 1689748306195, - 1689748306212, - 1689748306229, - 1689748306245, - 1689748306262, - 1689748306312, - 1689748306328, - 1689748306362, - 1689748306378, - 1689748306562, - 1689748306578, - 1689748306595, - 1689748306629, - 1689748306661, - 1689748306695, - 1689748306711, - 1689748306728, - 1689748306745, - 1689748306778, - 1689748306794, - 1689748306811, - 1689748306829 - ], - "p": [ - 0.5, - 0.79, - 0.73, - 0.77, - 0.68, - 0.72, - 0.73, - 0.74, - 0.68, - 0.68, - 0.77, - 0.76, - 0.73, - 0.74, - 0.74, - 0.68, - 0.68, - 0.68, - 0.76, - 0.76, - 0.75, - 0.73, - 0.76, - 0.75, - 0.77, - 0.79 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 306, - 312, - 324, - 335, - 341, - 344 - ], - "y": [ - 233, - 232, - 232, - 234, - 234, - 234 - ], - "t": [ - 1689748307331, - 1689748307360, - 1689748307377, - 1689748307394, - 1689748307410, - 1689748307427 - ], - "p": [ - 0.5, - 0.75, - 0.67, - 0.67, - 0.77, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 333, - 331, - 329, - 329, - 330 - ], - "y": [ - 218, - 223, - 232, - 238, - 243 - ], - "t": [ - 1689748307920, - 1689748307977, - 1689748307994, - 1689748308011, - 1689748308027 - ], - "p": [ - 0.5, - 0.77, - 0.81, - 0.77, - 0.75 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 355, - 360, - 363, - 367, - 369, - 371, - 370, - 370, - 370, - 370, - 370, - 372, - 372, - 372 - ], - "y": [ - 228, - 224, - 222, - 220, - 217, - 214, - 211, - 214, - 218, - 222, - 227, - 231, - 234, - 237 - ], - "t": [ - 1689748308672, - 1689748308743, - 1689748308759, - 1689748308776, - 1689748308793, - 1689748308810, - 1689748308860, - 1689748308921, - 1689748308943, - 1689748308960, - 1689748308976, - 1689748308992, - 1689748309009, - 1689748309065 - ], - "p": [ - 0.5, - 0.75, - 0.7, - 0.73, - 0.7, - 0.7, - 0.68, - 0.68, - 0.71, - 0.71, - 0.74, - 0.73, - 0.68, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 393, - 397, - 402, - 409, - 413, - 416 - ], - "y": [ - 224, - 222, - 223, - 223, - 224, - 225 - ], - "t": [ - 1689748309782, - 1689748309825, - 1689748309842, - 1689748309859, - 1689748309876, - 1689748309892 - ], - "p": [ - 0.5, - 0.79, - 0.75, - 0.78, - 0.72, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 392, - 397, - 400, - 407, - 413, - 417, - 420 - ], - "y": [ - 230, - 228, - 228, - 228, - 229, - 229, - 230 - ], - "t": [ - 1689748310171, - 1689748310225, - 1689748310242, - 1689748310258, - 1689748310275, - 1689748310291, - 1689748310325 - ], - "p": [ - 0.5, - 0.77, - 0.68, - 0.78, - 0.77, - 0.71, - 0.68 - ] - } -] diff --git a/test/integration/strokes/sumSimple.json b/test/integration/strokes/sumSimple.json deleted file mode 100644 index dfbd787a..00000000 --- a/test/integration/strokes/sumSimple.json +++ /dev/null @@ -1,101 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 461, "y": 215, "t": 1694506504676, "p": 0.1 }, - { "x": 464, "y": 213, "t": 1694506504695, "p": 0.7 }, - { "x": 471, "y": 206, "t": 1694506504728, "p": 0.82 }, - { "x": 475, "y": 201, "t": 1694506504744, "p": 0.77 }, - { "x": 482, "y": 194, "t": 1694506504760, "p": 0.82 }, - { "x": 486, "y": 185, "t": 1694506504777, "p": 0.82 }, - { "x": 491, "y": 176, "t": 1694506504793, "p": 0.68 }, - { "x": 494, "y": 167, "t": 1694506504809, "p": 0.82 }, - { "x": 496, "y": 172, "t": 1694506504955, "p": 0.75 }, - { "x": 496, "y": 177, "t": 1694506504972, "p": 0.74 }, - { "x": 496, "y": 207, "t": 1694506504988, "p": 0.45 }, - { "x": 497, "y": 232, "t": 1694506505004, "p": 0.5 }, - { "x": 497, "y": 245, "t": 1694506505021, "p": 0.64 }, - { "x": 497, "y": 258, "t": 1694506505036, "p": 0.64 }, - { "x": 497, "y": 267, "t": 1694506505053, "p": 0.81 }, - { "x": 497, "y": 272, "t": 1694506505069, "p": 0.74 }, - { "x": 497, "y": 276, "t": 1694506505086, "p": 0.71 }, - { "x": 498, "y": 281, "t": 1694506505102, "p": 0.75 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 583, "y": 180, "t": 1694506505627, "p": 0.1 }, - { "x": 583, "y": 187, "t": 1694506505693, "p": 0.78 }, - { "x": 583, "y": 197, "t": 1694506505708, "p": 0.68 }, - { "x": 580, "y": 231, "t": 1694506505725, "p": 0.42 }, - { "x": 580, "y": 242, "t": 1694506505741, "p": 0.67 }, - { "x": 578, "y": 253, "t": 1694506505757, "p": 0.67 }, - { "x": 578, "y": 260, "t": 1694506505774, "p": 0.78 }, - { "x": 578, "y": 266, "t": 1694506505790, "p": 0.77 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 557, "y": 236, "t": 1694506506167, "p": 0.1 }, - { "x": 560, "y": 235, "t": 1694506506196, "p": 0.68 }, - { "x": 564, "y": 234, "t": 1694506506228, "p": 0.72 }, - { "x": 569, "y": 232, "t": 1694506506261, "p": 0.75 }, - { "x": 573, "y": 232, "t": 1694506506277, "p": 0.71 }, - { "x": 576, "y": 232, "t": 1694506506293, "p": 0.68 }, - { "x": 583, "y": 232, "t": 1694506506310, "p": 0.78 }, - { "x": 590, "y": 232, "t": 1694506506326, "p": 0.78 }, - { "x": 595, "y": 231, "t": 1694506506342, "p": 0.75 }, - { "x": 598, "y": 231, "t": 1694506506358, "p": 0.68 }, - { "x": 601, "y": 230, "t": 1694506506374, "p": 0.68 }, - { "x": 605, "y": 229, "t": 1694506506405, "p": 0.72 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 649, "y": 176, "t": 1694506506971, "p": 0.1 }, - { "x": 656, "y": 175, "t": 1694506507003, "p": 0.79 }, - { "x": 659, "y": 174, "t": 1694506507019, "p": 0.68 }, - { "x": 663, "y": 174, "t": 1694506507036, "p": 0.71 }, - { "x": 668, "y": 174, "t": 1694506507052, "p": 0.74 }, - { "x": 671, "y": 174, "t": 1694506507068, "p": 0.68 }, - { "x": 674, "y": 179, "t": 1694506507084, "p": 0.76 }, - { "x": 680, "y": 186, "t": 1694506507101, "p": 0.81 }, - { "x": 683, "y": 191, "t": 1694506507117, "p": 0.76 }, - { "x": 685, "y": 196, "t": 1694506507133, "p": 0.75 }, - { "x": 686, "y": 199, "t": 1694506507149, "p": 0.68 }, - { "x": 686, "y": 202, "t": 1694506507165, "p": 0.68 }, - { "x": 680, "y": 208, "t": 1694506507198, "p": 0.81 }, - { "x": 676, "y": 210, "t": 1694506507215, "p": 0.73 }, - { "x": 666, "y": 216, "t": 1694506507230, "p": 0.66 }, - { "x": 658, "y": 220, "t": 1694506507247, "p": 0.81 }, - { "x": 645, "y": 228, "t": 1694506507263, "p": 0.61 }, - { "x": 640, "y": 229, "t": 1694506507279, "p": 0.75 }, - { "x": 644, "y": 230, "t": 1694506507409, "p": 0.72 }, - { "x": 652, "y": 230, "t": 1694506507425, "p": 0.8 }, - { "x": 660, "y": 230, "t": 1694506507441, "p": 0.8 }, - { "x": 671, "y": 230, "t": 1694506507457, "p": 0.67 }, - { "x": 677, "y": 230, "t": 1694506507474, "p": 0.77 }, - { "x": 682, "y": 230, "t": 1694506507490, "p": 0.74 }, - { "x": 687, "y": 234, "t": 1694506507506, "p": 0.77 }, - { "x": 690, "y": 236, "t": 1694506507522, "p": 0.7 }, - { "x": 693, "y": 240, "t": 1694506507554, "p": 0.74 }, - { "x": 693, "y": 244, "t": 1694506507570, "p": 0.71 }, - { "x": 692, "y": 248, "t": 1694506507603, "p": 0.72 }, - { "x": 687, "y": 252, "t": 1694506507619, "p": 0.77 }, - { "x": 681, "y": 254, "t": 1694506507635, "p": 0.77 }, - { "x": 678, "y": 255, "t": 1694506507651, "p": 0.68 }, - { "x": 664, "y": 257, "t": 1694506507668, "p": 0.62 }, - { "x": 659, "y": 257, "t": 1694506507684, "p": 0.74 }, - { "x": 653, "y": 257, "t": 1694506507700, "p": 0.77 }, - { "x": 649, "y": 257, "t": 1694506507716, "p": 0.71 }, - { "x": 646, "y": 257, "t": 1694506507732, "p": 0.68 } - ] - } -] diff --git a/test/integration/strokesDatas.js b/test/integration/strokesDatas.js deleted file mode 100644 index 537ad699..00000000 --- a/test/integration/strokesDatas.js +++ /dev/null @@ -1,627 +0,0 @@ -const hStrokes = require("./strokes/h.json") -module.exports.h = { - type: "TEXT", - strokes: hStrokes, - exports: { - "text/plain": ["h"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloStrokes = require("./strokes/hello.json") -module.exports.hello = { - type: "TEXT", - strokes: helloStrokes, - exports: { - "text/plain": ["h", "he", "hel", "hell", "hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "kello", "helloo", "hellor", "hello"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloStrike = require("./strokes/helloStrike.json") -module.exports.helloStrikeStroke = { - name: "helloStrike", - type: "TEXT", - strokes: helloStrike, - apiVersion: "V4", - exports: { - "text/plain": ["hello", ""], - }, -} - -const helloOne = require("./strokes/helloOneStroke.json") -module.exports.helloOneStroke = { - type: "TEXT", - strokes: helloOne, - exports: { - "text/plain": ["hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "helto", "helts", "kelto", "felto"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloHowAreYouStrokes = require("./strokes/helloHowAreYou.json") -module.exports.helloHowAreYou = { - type: "TEXT", - strokes: helloHowAreYouStrokes, - exports: { - "text/plain": [ - "hello", - "hello how", - "hello how o", - "hello how are", - "hello how are you", - "hello how are you?", - "hello how are you?", - ], - }, -} - -const oneStrokes = require("./strokes/one.json") -module.exports.one = { - type: "MATH", - strokes: oneStrokes, - exports: { - LATEX: ["1"], - }, -} - -const equation1Stroke = require("./strokes/equation1.json") -module.exports.equation1 = { - type: "MATH", - strokes: equation1Stroke, - exports: { - LATEX: ['y', 'y-', 'y=', 'y=3', 'y=30', 'y=3x', 'y=3x-', 'y=3x+', 'y=3x+2'], - MATHML: { - STANDARD: ` y = 3 x + 2 ` - } - }, -} - -const equation2Stroke = require('./strokes/equation2.json') -module.exports.equation2 = { - type: 'MATH', - strokes: equation2Stroke, - exports: { - LATEX: ['-', '\\sqrt {2}', 'r', ''] - }, -} - -const fenceStroke = require("./strokes/fence.json") -module.exports.fence = { - type: "MATH", - strokes: fenceStroke, - exports: { - MATHML: { - STANDARD: [ - "\n" + - " \n" + - " { \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 3 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 6 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - ], - MSOFFICE: [ - "\n" + - ' \n' + - " \n" + - " \n" + - " \n" + - " \n" + - " 3 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 6 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - ], - }, - }, -} - -const lineStroke = require("./strokes/line.json") -module.exports.line = { - type: "DIAGRAM", - strokes: lineStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Edge", - kind: "line", - connected: [], - ports: [], - x1: 60.0628433, - y1: 47.2759705, - x2: 98.6923065, - y2: 47.0647392, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const rectangleStroke = require("./strokes/rectangle.json") -module.exports.rectangle = { - type: "DIAGRAM", - strokes: rectangleStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Edge", - kind: "line", - connected: [], - ports: [], - x1: 57.5701027, - y1: 52.1299248, - x2: 56.6754189, - y2: 71.9691315, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Node", - kind: "rectangle", - x: 56.8398209, - y: 51.9560471, - width: 33.1532364, - height: 19.9649887, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const ponyEraseStroke = require("./strokes/ponyErase.json") -module.exports.ponyErase = { - type: "TEXT", - strokes: ponyEraseStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "Pony", "pong", "pory", "fony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "ony", - words: [ - { - label: "ony", - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -module.exports.ponyErasePrecisely = { - type: "TEXT", - strokes: ponyEraseStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "Pony", "pong", "pory", "fony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "oony", "rony", "wony", "pony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const klopmoStrokes = require("./strokes/CustomLexicon/klopmo.json") -module.exports.klopmo = { - type: "TEXT", - strokes: klopmoStrokes, - exports: { - "text/plain": ["klopmo"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "klopmo", - words: [ - { - label: "klopmo", - candidates: ["klopmo", "Klopmo"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const jilopStrokes = require("./strokes/CustomLexicon/jilop.json") - -module.exports.jilop = { - type: "TEXT", - strokes: jilopStrokes, - exports: { - "text/plain": ["jilop"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "jilop", - words: [ - { - label: "jilop", - candidates: ["jilop", "Jilop"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const sumStroke = require('./strokes/sum.json') -module.exports.sum = { - type: 'MATH', - strokes: sumStroke, - exports: { - LATEX: ['3', '3-', '3+', '3+1', '3+1-', '3+1='] - }, - converts: { - LATEX: ['3+1=4'] - } -} - -const sumSimpleStroke = require('./strokes/sumSimple.json') -module.exports.sumSimple = { - type: 'MATH', - strokes: sumSimpleStroke, - exports: { - LATEX: ['1', '1-', '1+', '1+3'] - }, - converts: { - LATEX: ['1+3=4'] - } -} - -const buenosStrokes = require("./strokes/Interact/buenos.json") -module.exports.buenos = { - type: "TEXT", - strokes: buenosStrokes, - exports: { - "text/plain": ["b", "bu", "bue", "buen", "bueno", "buenos"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "buenos", - words: [ - { - label: "buenos", - candidates: ["buenos"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const airesStrokes = require("./strokes/Interact/aires.json") -module.exports.aires = { - type: "TEXT", - strokes: airesStrokes, - exports: { - "text/plain": ["a", "ai", "air", "aire", "aires"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "aires", - words: [ - { - label: "aires", - candidates: ["aires"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const parisStrokes = require("./strokes/Interact/paris.json") -module.exports.paris = { - type: "TEXT", - strokes: parisStrokes, - exports: { - "text/plain": ["p", "pa", "par", "pari", "paris"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "paris", - words: [ - { - label: "paris", - candidates: ["paris"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const tokyoStrokes = require("./strokes/Interact/tokyo.json") -module.exports.tokyo = { - type: "TEXT", - strokes: tokyoStrokes, - exports: { - "text/plain": ["t", "to", "tok", "toky", "tokyo"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "tokyo", - words: [ - { - label: "tokyo", - candidates: ["tokyo"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const madridStrokes = require("./strokes/Interact/madrid.json") -module.exports.madrid = { - type: "TEXT", - strokes: madridStrokes, - exports: { - "text/plain": ["m", "ma", "mad", "madr", "madri", "madrid"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "madrid", - words: [ - { - label: "madrid", - candidates: ["madrid"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const romeStrokes = require("./strokes/Interact/rome.json") -module.exports.rome = { - type: "TEXT", - strokes: romeStrokes, - exports: { - "text/plain": ["r", "ro", "rom", "rome"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "rome", - words: [ - { - label: "rome", - candidates: ["rome"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const claclaclaStrokes = require("./strokes/CustomLexicon/claclacla.json") -module.exports.claclacla = { - type: "TEXT", - strokes: claclaclaStrokes, - exports: { - "text/plain": ["claclacla"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "claclacla", - words: [ - { - label: "claclacla", - candidates: [ - "claclacla", - "Claclacla", - "claclacha", - "claclache", - "claclacle", - "elaclacha", - ], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const buenosAiresStrokes = require("./strokes/Interact/buenosAires.json") -module.exports.buenosAires = { - type: "TEXT", - strokes: buenosAiresStrokes, - exports: { - "text/plain": ["buenos aires"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "buenos aires", - words: [ - { - label: "buenos aires", - candidates: ["buenos aires"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const abrausorusStrokes = require("./strokes/abrausorus.json") -module.exports.abrausorus = { - type: "TEXT", - strokes: abrausorusStrokes, - exports: { - "text/plain": ["abrausorus"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "abrausorus", - words: [ - { - label: "abrausorus", - candidates: ["abrausorus"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const centralProcessingUnitStrokes = require("./strokes/multiple-inputs/centralProcessingUnit.json") -module.exports.centralProcessingUnit = { - type: "TEXT", - strokes: centralProcessingUnitStrokes, - exports: { - "text/plain": "central processing unit", - }, -} - -const Strokes1943 = require("./strokes/multiple-inputs/1943.json") -module.exports.oneThousandNineHundredAndFortyThree = { - type: "TEXT", - strokes: Strokes1943, - exports: { - "text/plain": "1943", - }, -} - -const Strokes1993 = require("./strokes/multiple-inputs/1993.json") -module.exports.oneThousandNineHundredAndNintyThree = { - type: "TEXT", - strokes: Strokes1993, - exports: { - "text/plain": "1993", - }, -} - -const helloOneSurrounded = require("./strokes/helloOneStrokeSurrounded.json") -module.exports.helloOneSurrounded = { - type: "TEXT", - strokes: helloOneSurrounded, - exports: { - "text/plain": ["hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "helto", "helts", "kelto", "felto"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} diff --git a/test/unit/00-configuration/00-DefaultConfiguration.test.ts b/test/unit/00-configuration/00-DefaultConfiguration.test.ts deleted file mode 100644 index 723f9eb5..00000000 --- a/test/unit/00-configuration/00-DefaultConfiguration.test.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { DefaultConfiguration } from "../../../src/iink" - -describe("DefaultConfiguration.ts", () => -{ - describe("should have DefaultServerConfiguration", () => - { - test("should have protocol", () => - { - expect(DefaultConfiguration.server.protocol).toStrictEqual("WEBSOCKET") - }) - test("should have scheme", () => - { - expect(DefaultConfiguration.server.scheme).toStrictEqual("https") - }) - test("should have host", () => - { - expect(DefaultConfiguration.server.host).toStrictEqual("cloud.myscript.com") - }) - test("should not have applicationKey", () => - { - expect(DefaultConfiguration.server.applicationKey).toStrictEqual("") - }) - test("should not have hmacKey", () => - { - expect(DefaultConfiguration.server.hmacKey).toStrictEqual("") - }) - test("should not useWindowLocation", () => - { - expect(DefaultConfiguration.server.useWindowLocation).toStrictEqual(false) - }) - }) - - describe("should have DefaultRecognitionConfiguration", () => - { - test("should have type", () => - { - expect(DefaultConfiguration.recognition.type).toStrictEqual("TEXT") - }) - test("should have lang", () => - { - expect(DefaultConfiguration.recognition.lang).toStrictEqual("en_US") - }) - test("should have gesture", () => - { - expect(DefaultConfiguration.recognition.gesture.enable).toStrictEqual(true) - }) - test("should have renderer", () => - { - expect(DefaultConfiguration.recognition.renderer.debug["draw-image-boxes"]).toStrictEqual(false) - expect(DefaultConfiguration.recognition.renderer.debug["draw-image-boxes"]).toStrictEqual(false) - }) - test("should have math", () => - { - expect(DefaultConfiguration.recognition.math.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.math.solver?.enable).toStrictEqual(true) - expect(DefaultConfiguration.recognition.math.eraser?.["erase-precisely"]).toStrictEqual(false) - expect(DefaultConfiguration.recognition.math["undo-redo"]?.mode).toStrictEqual("stroke") - }) - test("should have text", () => - { - expect(DefaultConfiguration.recognition.text.guides?.enable).toStrictEqual(true) - expect(DefaultConfiguration.recognition.text.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.text.eraser?.["erase-precisely"]).toStrictEqual(false) - }) - test("should have diagram", () => - { - expect(DefaultConfiguration.recognition.diagram.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.diagram.eraser?.["erase-precisely"]).toStrictEqual(false) - }) - test("should have raw-content", () => - { - expect(DefaultConfiguration.recognition["raw-content"]).not.toHaveProperty("mimeTypes") - expect(DefaultConfiguration.recognition["raw-content"].recognition?.text).toStrictEqual(true) - expect(DefaultConfiguration.recognition["raw-content"].recognition?.shape).toStrictEqual(true) - expect(DefaultConfiguration.recognition["raw-content"].eraser?.["erase-precisely"]).toStrictEqual(false) - }) - }) - - describe("should have DefaultGrabberConfiguration", () => - { - test("should have listenerOptions", () => - { - expect(DefaultConfiguration.grabber.listenerOptions.capture).toStrictEqual(false) - expect(DefaultConfiguration.grabber.listenerOptions.passive).toStrictEqual(true) - }) - test("should have xyFloatPrecision", () => - { - expect(DefaultConfiguration.grabber.xyFloatPrecision).toStrictEqual(0) - }) - test("should have timestampFloatPrecision", () => - { - expect(DefaultConfiguration.grabber.timestampFloatPrecision).toStrictEqual(0) - }) - }) - - describe("should have DefaultRenderingConfiguration", () => - { - test("should have minHeight", () => - { - expect(DefaultConfiguration.rendering.minHeight).toStrictEqual(100) - }) - test("should have minWidth", () => - { - expect(DefaultConfiguration.rendering.minWidth).toStrictEqual(100) - }) - test("should have smartGuide", () => - { - expect(DefaultConfiguration.rendering.smartGuide.enable).toStrictEqual(true) - expect(DefaultConfiguration.rendering.smartGuide.fadeOut.enable).toStrictEqual(false) - expect(DefaultConfiguration.rendering.smartGuide.fadeOut.duration).toStrictEqual(5000) - }) - }) - - describe("should have DefaultTriggerConfiguration", () => - { - test("should have exportContent", () => - { - expect(DefaultConfiguration.triggers.exportContent).toStrictEqual("POINTER_UP") - }) - test("should have exportContentDelay", () => - { - expect(DefaultConfiguration.triggers.exportContentDelay).toStrictEqual(1000) - }) - test("should have resizeTriggerDelay", () => - { - expect(DefaultConfiguration.triggers.resizeTriggerDelay).toStrictEqual(100) - }) - }) - - describe("should have DefaultEventsConfiguration", () => - { - test("should have processDelay", () => - { - expect(DefaultConfiguration.events.processDelay).toStrictEqual(10) - }) - }) - - describe("should have DefaultUndoRedoConfiguration", () => - { - test("should have maxStackSize", () => - { - expect(DefaultConfiguration["undo-redo"].maxStackSize).toStrictEqual(100) - }) - }) -}) diff --git a/test/unit/00-configuration/01-Configuration.test.ts b/test/unit/00-configuration/01-Configuration.test.ts deleted file mode 100644 index 2e229071..00000000 --- a/test/unit/00-configuration/01-Configuration.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import -{ - ConfigurationTextWebsocket, - ConfigurationTextRest, - ConfigurationDiagramRest, - ConfigurationRawContentRest, - AllOverrideConfiguration, -} from "../_dataset/configuration.dataset" -import { TConfiguration, TConfigurationClient } from "../../../src/@types" -import { DefaultConfiguration, Configuration } from "../../../src/iink" - -const configurationDefault = new Configuration() - -describe("Configuration.ts", () => -{ - test("should be default configuration", () => - { - expect(configurationDefault.events).toStrictEqual(DefaultConfiguration.events) - expect(configurationDefault.grabber).toStrictEqual(DefaultConfiguration.grabber) - expect(configurationDefault.recognition).toStrictEqual(DefaultConfiguration.recognition) - expect(configurationDefault.rendering).toStrictEqual(DefaultConfiguration.rendering) - expect(configurationDefault.server).toStrictEqual(DefaultConfiguration.server) - expect(configurationDefault.triggers).toStrictEqual(DefaultConfiguration.triggers) - expect(configurationDefault["undo-redo"]).toStrictEqual(DefaultConfiguration["undo-redo"]) - - }) - - const configurationsClient: { name: string, config: TConfigurationClient }[] = [ - { name: "ConfigurationTextWebsocket", config: ConfigurationTextWebsocket }, - { name: "ConfigurationTextRest", config: ConfigurationTextRest }, - { name: "ConfigurationDiagramRest", config: ConfigurationDiagramRest }, - { name: "ConfigurationRawContentRest", config: ConfigurationRawContentRest } - ] - - configurationsClient.forEach(cc => - { - const configuration: TConfiguration = new Configuration(cc.config) - describe(`should merge ${ cc.name } with DefaultConfiguration`, () => - { - test("should have server.protocol", () => - { - expect(configuration.server.protocol).toStrictEqual(cc.config?.server?.protocol) - }) - test("should have server.scheme", () => - { - expect(configuration.server.scheme).toStrictEqual(cc.config?.server?.scheme) - }) - test("should have server.host", () => - { - expect(configuration.server.host).toStrictEqual(cc.config?.server?.host) - }) - test("should have server.applicationKey", () => - { - expect(configuration.server.applicationKey).toStrictEqual(cc.config?.server?.applicationKey) - }) - test("should have server.hmacKey", () => - { - expect(configuration.server.hmacKey).toStrictEqual(cc.config?.server?.hmacKey) - }) - test("should have default server.websocket", () => - { - expect(configuration.server.websocket).toStrictEqual(configurationDefault.server.websocket) - }) - test("should have recognition.type", () => - { - expect(configuration.recognition.type).toStrictEqual(cc.config?.recognition?.type) - }) - if (cc.config.recognition?.type === "Raw Content") { - test("should not have recognition[raw-content].mimeTypes", () => - { - expect(configuration.recognition["raw-content"]).not.toHaveProperty("raw-content") - }) - } else { - test("should have recognition.text.mimeTypes", () => - { - switch (configuration.recognition.type) { - case "MATH": - expect(configuration.recognition.math.mimeTypes).toStrictEqual(cc.config?.recognition?.math?.mimeTypes) - break - case "DIAGRAM": - expect(configuration.recognition.diagram.mimeTypes).toStrictEqual(cc.config?.recognition?.diagram?.mimeTypes) - break - case "TEXT": - expect(configuration.recognition.text.mimeTypes).toStrictEqual(cc.config?.recognition?.text?.mimeTypes) - break - default: - break - } - }) - } - }) - }) - - describe("should override all values", () => - { - const overrideConfig: TConfiguration = new Configuration(AllOverrideConfiguration) - - test("should override events", () => - { - expect(overrideConfig.events).toStrictEqual(AllOverrideConfiguration.events) - }) - - test("should override grabber", () => - { - expect(overrideConfig.grabber).toStrictEqual(AllOverrideConfiguration.grabber) - }) - - test("should override recognition", () => - { - expect(overrideConfig.recognition).toStrictEqual(AllOverrideConfiguration.recognition) - }) - - test("should override rendering", () => - { - expect(overrideConfig.rendering).toStrictEqual(AllOverrideConfiguration.rendering) - }) - - test("should override server", () => - { - expect(overrideConfig.server).toStrictEqual(AllOverrideConfiguration.server) - }) - - test("should override triggers", () => - { - expect(overrideConfig.triggers).toStrictEqual(AllOverrideConfiguration.triggers) - }) - - test("should override undo-redo", () => - { - expect(overrideConfig["undo-redo"]).toStrictEqual(AllOverrideConfiguration["undo-redo"]) - }) - }) - - describe("specifics rules", () => - { - test("should add mimeType JIIX if rendering.smartGuide = true", () => - { - const conf = JSON.parse(JSON.stringify(DefaultConfiguration)) as TConfiguration - conf.server.protocol = "WEBSOCKET" - conf.recognition.type = "TEXT" - conf.rendering.smartGuide.enable = true - conf.recognition.text.mimeTypes = ["text/plain"] - expect(conf.recognition.text.mimeTypes).not.toContain("application/vnd.myscript.jiix") - const c: TConfiguration = new Configuration(conf) - expect(c.recognition.text.mimeTypes).toContain("application/vnd.myscript.jiix") - }) - - test("should set rendering.smartGuide = false if REST", () => - { - const conf = { ...DefaultConfiguration } - conf.server.protocol = "REST" - conf.rendering.smartGuide.enable = true - const c: TConfiguration = new Configuration(conf) - expect(c.rendering.smartGuide.enable).toStrictEqual(false) - }) - - test("should set triggers.exportContent = QUIET_PERIOD if REST", () => - { - const conf = { ...DefaultConfiguration } - conf.server.protocol = "REST" - conf.triggers.exportContent = "POINTER_UP" - const c: TConfiguration = new Configuration(conf) - expect(c.triggers.exportContent).toStrictEqual("QUIET_PERIOD") - }) - - test("should set rendering.smartGuide = false if not TEXT", () => - { - const conf = { ...DefaultConfiguration } - conf.recognition.type = "MATH" - conf.rendering.smartGuide.enable = true - const c: TConfiguration = new Configuration(conf) - expect(c.rendering.smartGuide.enable).toStrictEqual(false) - }) - - test("should set server.scheme & server.host if server.useWindowLocation = true", () => - { - const conf = { ...DefaultConfiguration } - conf.server.useWindowLocation = true - - Object.defineProperty(window, "location", { - value: new URL("https://localhost:3000") - }) - - const c: TConfiguration = new Configuration(conf) - expect(c.server.scheme).toStrictEqual(window.location.protocol.replace(":", "")) - expect(c.server.host).toStrictEqual(window.location.host) - }) - }) - -}) diff --git a/test/unit/01-grabber/00-PointerEventGrabber.test.ts b/test/unit/01-grabber/00-PointerEventGrabber.test.ts deleted file mode 100644 index caa412d3..00000000 --- a/test/unit/01-grabber/00-PointerEventGrabber.test.ts +++ /dev/null @@ -1,281 +0,0 @@ -import { DoubleTouchEventFake, LeftClickEventFake, RightClickEventFake, TouchEventFake } from "../utils/PointerEventFake" -import { TGrabberConfiguration, IGrabber } from "../../../src/@types" -import { DefaultConfiguration, PointerEventGrabber } from "../../../src/iink" - -describe("PointerEventGrabber.ts", () => -{ - - test("should create with default configuration", () => - { - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - expect(grabber).toBeDefined() - }) - - describe("should attach & detach", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.attach(wrapperHTML) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - - const pointerMoveEvt = new LeftClickEventFake("pointermove", { - pointerType: "pen", - clientX: 15, - clientY: 15, - pressure: 1 - }) - pointerMoveEvt.pointerId = pointerDownEvt.pointerId - - const pointerUpEvt = new LeftClickEventFake("pointerup", { - pointerType: "pen", - clientX: 15, - clientY: 15, - pressure: 1 - }) - pointerUpEvt.pointerId = pointerDownEvt.pointerId - - test("should listen pointerdown event", () => - { - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).toBeCalledTimes(1) - }) - - test("should listen pointermove event", () => - { - wrapperHTML.dispatchEvent(pointerMoveEvt) - expect(grabber.onPointerMove).toBeCalledTimes(1) - }) - - test("should listen pointerup event", () => - { - wrapperHTML.dispatchEvent(pointerUpEvt) - expect(grabber.onPointerUp).toBeCalledTimes(1) - }) - - test("should call detach if already attach", () => - { - const g: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - g.onPointerDown = jest.fn() - g.onPointerMove = jest.fn() - g.onPointerUp = jest.fn() - g.detach = jest.fn() - g.attach(wrapperHTML) - g.attach(wrapperHTML) - expect(g.detach).toBeCalledTimes(1) - }) - - test("should not listen pointerdown event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - }) - - test("should not listen pointermove event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerMoveEvt) - expect(grabber.onPointerMove).not.toBeCalled() - }) - - test("should not listen pointerup event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerUpEvt) - expect(grabber.onPointerUp).not.toBeCalled() - }) - }) - - describe("Should extract TPointer from event", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.onPointerDown = jest.fn() - grabber.attach(wrapperHTML) - - test("should extract TPointer from mouseEvent", () => - { - const mouseDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - wrapperHTML.dispatchEvent(mouseDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - mouseDownEvt, - expect.objectContaining({ - x: mouseDownEvt.clientX, - y: mouseDownEvt.clientY, - p: mouseDownEvt.pressure - }) - ) - }) - - test("should extract TPointer from touchEvent", () => - { - const touchDownEvt = new TouchEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - wrapperHTML.dispatchEvent(touchDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - touchDownEvt, - expect.objectContaining({ - x: touchDownEvt.changedTouches[0].clientX, - y: touchDownEvt.changedTouches[0].clientY, - p: touchDownEvt.pressure - }) - ) - }) - }) - - describe("Should use configuration", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - test("should not round values with default configuration", () => - { - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: pointerDownEvt.clientX, - y: pointerDownEvt.clientY, - p: pointerDownEvt.pressure - }) - ) - grabber.detach() - }) - - test("should round values from configuration", () => - { - const grabberConfig: TGrabberConfiguration = { ...DefaultConfiguration.grabber, xyFloatPrecision: 2 } - const grabber: IGrabber = new PointerEventGrabber(grabberConfig) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - grabber.onPointerDown = jest.fn() - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: Math.round(pointerDownEvt.clientX / 100) * 100, - y: Math.round(pointerDownEvt.clientY / 100) * 100, - p: pointerDownEvt.pressure - }) - ) - }) - - test("should not round values from configuration if negative precision", () => - { - const grabberConfig: TGrabberConfiguration = { ...DefaultConfiguration.grabber, xyFloatPrecision: -2 } - const grabber: IGrabber = new PointerEventGrabber(grabberConfig) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - grabber.onPointerDown = jest.fn() - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: pointerDownEvt.clientX, - y: pointerDownEvt.clientY, - p: pointerDownEvt.pressure - }) - ) - }) - }) - - describe("Should ignore Event", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.attach(wrapperHTML) - grabber.onPointerDown = jest.fn() - - test("should not listen right click event", () => - { - const pointerDownEvt = new RightClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 300, - clientY: 500, - pressure: 1 - }) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - grabber.detach(wrapperHTML) - }) - - test("should not listen right click event", () => - { - const pointerDownEvt = new DoubleTouchEventFake("pointerdown", { - pointerType: "pen", - clientX: 300, - clientY: 500, - pressure: 1 - }) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - grabber.detach(wrapperHTML) - }) - }) - -}) diff --git a/test/unit/02-model/00-Stroke.test.ts b/test/unit/02-model/00-Stroke.test.ts deleted file mode 100644 index c9741bd2..00000000 --- a/test/unit/02-model/00-Stroke.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { TStroke, TPenStyle } from "../../../src/@types" -import { Stroke, DefaultPenStyle } from "../../../src/iink" - -describe("Stroke.ts", () => -{ - test("should create with default pointerType", () => - { - const stroke: TStroke = new Stroke(DefaultPenStyle, 12) - expect(stroke).toBeDefined() - expect(stroke.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(stroke.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(stroke.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(stroke.style.color).toBe(DefaultPenStyle.color) - expect(stroke.style.width).toBe(DefaultPenStyle.width) - expect(stroke.elementType).toBeUndefined() - expect(stroke.pointers).toHaveLength(0) - expect(stroke.pointerId).toBe(12) - expect(stroke.pointerType).toBe("pen") - expect(stroke.type).toBe("stroke") - }) - - test("should create with pointerType mouse", () => - { - const stroke: TStroke = new Stroke(DefaultPenStyle, 12, "mouse") - expect(stroke.pointerType).toBe("mouse") - }) - - test("should create with custom PenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "purple", - "-myscript-pen-width": 12, - color: "green", - width: 42 - } - - const stroke: TStroke = new Stroke(penStyle, 12) - expect(stroke).toBeDefined() - expect(stroke.style["-myscript-pen-fill-color"]).toBe(penStyle["-myscript-pen-fill-color"]) - expect(stroke.style["-myscript-pen-fill-style"]).toBe(penStyle["-myscript-pen-fill-style"]) - expect(stroke.style["-myscript-pen-width"]).toBe(penStyle["-myscript-pen-width"]) - expect(stroke.style.color).toBe(penStyle.color) - expect(stroke.style.width).toBe(penStyle.width) - }) -}) diff --git a/test/unit/02-model/01-Model.test.ts b/test/unit/02-model/01-Model.test.ts deleted file mode 100644 index 08d6183d..00000000 --- a/test/unit/02-model/01-Model.test.ts +++ /dev/null @@ -1,590 +0,0 @@ -import { delay } from "../utils/helpers" -import { IModel, TExport, TPointer } from "../../../src/@types" -import { Model, Stroke, DefaultPenStyle } from "../../../src/iink" - -describe("Model.ts", () => -{ - const width = 100, height = 100 - test("should create", () => - { - const model: IModel = new Model(width, height) - expect(model).toBeDefined() - }) - - describe("mergeExport", () => - { - test("should initialize export if toBeUndefined", () => - { - const model: IModel = new Model(width, height) - const e: TExport = { "text/plain": "poney" } - expect(model.exports).toBeUndefined() - model.mergeExport(e) - expect(model.exports).toEqual(e) - }) - test("should merge export", () => - { - const model: IModel = new Model(width, height) - const originExport: TExport = { - "application/vnd.myscript.jiix": { - "type": "Text", - "label": "poney", - "words": [ - { - "label": "poney", - "candidates": ["poney", "Poney", "ponay", "ponex", "pony"] - } - ], - "version": "3", - "id": "MainBlock" - } - } - model.exports = originExport - const e: TExport = { "text/plain": "poney" } - - model.mergeExport(e) - expect(model.exports).toMatchObject(originExport) - expect(model.exports).toMatchObject(e) - }) - }) - - describe("mergeConvert", () => - { - test("should initialize export if toBeUndefined", () => - { - const model: IModel = new Model(width, height) - const e: TExport = { "text/plain": "poney" } - expect(model.converts).toBeUndefined() - model.mergeConvert(e) - expect(model.converts).toEqual(e) - }) - test("should merge export", () => - { - const model: IModel = new Model(width, height) - const originExport: TExport = { - "application/vnd.myscript.jiix": { - "type": "Text", - "label": "poney", - "words": [ - { - "label": "poney", - "candidates": ["poney", "Poney", "ponay", "ponex", "pony"] - } - ], - "version": "3", - "id": "MainBlock" - } - } - model.converts = originExport - const e: TExport = { "text/plain": "poney" } - - model.mergeConvert(e) - expect(model.converts).toMatchObject(originExport) - expect(model.converts).toMatchObject(e) - }) - }) - - describe("addPoint", () => - { - const model: IModel = new Model(width, height) - test("should add point to x, y, t & t array", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - model.addPoint(stroke, point) - - expect(stroke.pointers).toHaveLength(1) - expect(stroke.pointers[0].x).toBe(point.x) - expect(stroke.pointers[0].y).toBe(point.y) - expect(stroke.pointers[0].p).toBe(point.p) - expect(stroke.pointers[0].t).toBe(point.t) - }) - - test("should not add point if x is too close", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 10, - p: 10, - x: 1, - y: 10 - } - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - }) - - test("should not add point if y is too close", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 10, - p: 10, - x: 10, - y: 1 - } - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - }) - }) - - describe("updateStroke", () => - { - test("should updateStroke", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - const strokeUpdated = new Stroke(DefaultPenStyle, 1) - strokeUpdated.id = stroke.id - strokeUpdated.pointers.push({ p: 0.5, t: 0.5, x: 100, y: 27 }) - model.updateStroke(strokeUpdated) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(strokeUpdated) - }) - test("should not updateStroke if id not exist", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - const strokeUpdated = new Stroke(DefaultPenStyle, 1) - strokeUpdated.id = "pouette" - strokeUpdated.pointers.push({ p: 0.5, t: 0.5, x: 100, y: 27 }) - model.updateStroke(strokeUpdated) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).not.toStrictEqual(strokeUpdated) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - }) - }) - - describe("removeStroke", () => - { - test("should removeStroke", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - model.removeStroke(stroke.id) - expect(model.rawStrokes).toHaveLength(0) - }) - test("should not removeStroke if id not exist", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - model.removeStroke("pouette") - expect(model.rawStrokes).toHaveLength(1) - }) - }) - - describe("rawStrokes", () => - { - test("should addStrokes", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - }) - - test("should extractUnsentStrokes", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - const extractStroke = model.extractUnsentStrokes() - expect(extractStroke).toHaveLength(1) - expect(extractStroke[0]).toStrictEqual(stroke) - expect(model.rawStrokes).toHaveLength(1) - }) - }) - - describe("currentStroke", () => - { - const model: IModel = new Model(width, height) - test("should initCurrentStroke", async () => - { - expect(model.currentStroke).toBeUndefined() - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - expect(model.creationTime).toStrictEqual(model.modificationDate) - await delay(100) - model.initCurrentStroke(point, 42, "mouse", DefaultPenStyle) - expect(model.modificationDate - model.creationTime).toBeGreaterThanOrEqual(100) - expect(model.currentStroke).toBeDefined() - expect(model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(model.currentStroke?.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(model.currentStroke?.style.color).toBe(DefaultPenStyle.color) - expect(model.currentStroke?.style.width).toBe(DefaultPenStyle.width) - expect(model.currentStroke?.pointers).toHaveLength(1) - expect(model.currentStroke?.pointers[0].x).toBe(point.x) - expect(model.currentStroke?.pointers[0].y).toBe(point.y) - expect(model.currentStroke?.pointers[0].t).toBe(point.t) - expect(model.currentStroke?.pointers[0].p).toBe(point.p) - }) - test("should initCurrentStroke with -myscript-pen-width", async () => - { - const _model: IModel = new Model(width, height) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - const style = { ...DefaultPenStyle } - style["-myscript-pen-width"] = 2 - expect(_model.creationTime).toStrictEqual(_model.modificationDate) - await delay(101) - _model.initCurrentStroke(point, 42, "mouse", style) - expect(_model.modificationDate - _model.creationTime).toBeGreaterThanOrEqual(100) - expect(_model.currentStroke).toBeDefined() - expect(_model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(style["-myscript-pen-fill-color"]) - expect(_model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(style["-myscript-pen-fill-style"]) - expect(_model.currentStroke?.style["-myscript-pen-width"]).toBe(style["-myscript-pen-width"]) - expect(_model.currentStroke?.style.color).toBe(style.color) - expect(_model.currentStroke?.style.width).toBe(style.width) - expect(model.currentStroke?.pointers).toHaveLength(1) - expect(model.currentStroke?.pointers[0].x).toBe(point.x) - expect(model.currentStroke?.pointers[0].y).toBe(point.y) - expect(model.currentStroke?.pointers[0].t).toBe(point.t) - expect(model.currentStroke?.pointers[0].p).toBe(point.p) - }) - - test("should appendToCurrentStroke", () => - { - expect(model.currentStroke).toBeDefined() - const point: TPointer = { - t: 15, - p: 15, - x: 15, - y: 15 - } - model.appendToCurrentStroke(point) - expect(model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(model.currentStroke?.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(model.currentStroke?.style.color).toBe(DefaultPenStyle.color) - expect(model.currentStroke?.style.width).toBe(DefaultPenStyle.width) - expect(model.currentStroke?.pointers).toHaveLength(2) - expect(model.currentStroke?.pointers[1].x).toBe(point.x) - expect(model.currentStroke?.pointers[1].y).toBe(point.y) - expect(model.currentStroke?.pointers[1].t).toBe(point.t) - expect(model.currentStroke?.pointers[1].p).toBe(point.p) - }) - - test("should endCurrentStroke", () => - { - model.addPoint = jest.fn() - model.addStroke = jest.fn() - expect(model.currentStroke).toBeDefined() - const currentStroke = { ...model.currentStroke } - const point: TPointer = { - t: 25, - p: 25, - x: 25, - y: 25 - } - model.endCurrentStroke(point) - expect(model.currentStroke).toBeUndefined() - expect(model.addPoint).toBeCalledTimes(1) - expect(model.addPoint).toBeCalledWith(currentStroke, point) - expect(model.addStroke).toBeCalledTimes(1) - expect(model.addStroke).toBeCalledWith(currentStroke) - }) - }) - - describe("appendSelectedStrokesFromPoint", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - test("shoud select stroke when point on stroke", () => - { - model.appendSelectedStrokesFromPoint({ x: 1, y: 1 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-1") - }) - test("shoud reset selectedStrokes", () => - { - expect(model.selectedStrokes).toHaveLength(1) - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - }) - test("should select the stroke when the point is at a distance less than 10", () => - { - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 36, y: 41 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - }) - test("should not select the stroke when the point is at a distance less than 10", () => - { - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 56, y: 51 }) - expect(model.selectedStrokes).toHaveLength(0) - }) - test("should not select the same stroke twice", () => - { - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 36, y: 41 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - model.appendSelectedStrokesFromPoint({ x: 36, y: 40 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - }) - }) - - describe("removeStrokesFromPoint", () => - { - test("shoud remove stroke when point on stroke", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 1, y: 1 }) - expect(idsRemoves).toHaveLength(1) - expect(idsRemoves[0]).toEqual("stroke-1") - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0].id).toEqual("stroke-2") - }) - test("should remove the stroke when the point is at a distance less than 10", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 36, y: 41 }) - expect(idsRemoves).toHaveLength(1) - expect(idsRemoves[0]).toEqual("stroke-2") - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0].id).toEqual("stroke-1") - }) - test("should not remove the stroke when the point is at a distance less than 10", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 56, y: 51 }) - expect(idsRemoves).toHaveLength(0) - expect(model.rawStrokes).toHaveLength(2) - }) - }) - - describe("position", () => - { - const model: IModel = new Model(width, height) - test("should initialize position", () => - { - expect(model.positions.lastReceivedPosition).toBe(0) - expect(model.positions.lastSentPosition).toBe(0) - }) - test("should updatePositionSent", () => - { - model.updatePositionSent(5) - expect(model.positions.lastSentPosition).toBe(5) - }) - test("should updatePositionReceived", () => - { - model.updatePositionReceived() - expect(model.positions.lastReceivedPosition).toBe(model.positions.lastSentPosition) - }) - }) - - describe("clone", () => - { - const model: IModel = new Model(27, 5) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - model.initCurrentStroke(point, 666, "pen", DefaultPenStyle) - model.exports = { "text/plain": "M" } - test("should getClone", () => - { - const clone = model.getClone() - expect(clone != model).toBeTruthy() - expect(clone.currentStroke).toEqual(model.currentStroke) - expect(clone.currentStroke).not.toBe(model.currentStroke) - - expect(clone.exports).toEqual(model.exports) - expect(clone.exports).not.toBe(model.exports) - - expect(clone.height).toEqual(model.height) - - expect(clone.idle).toEqual(model.idle) - - expect(clone.positions).toEqual(model.positions) - expect(clone.positions).not.toBe(model.positions) - - expect(clone.rawStrokes).toEqual(model.rawStrokes) - expect(clone.rawStrokes).not.toBe(model.rawStrokes) - - expect(clone.width).toEqual(model.width) - }) - }) - - describe("clear", () => - { - test("should clear model", () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 10, x: 10, y: 10 } - const p3: TPointer = { t: 10, p: 10, x: 10, y: 10 } - - model.initCurrentStroke(p1, 42, "mouse", DefaultPenStyle) - model.endCurrentStroke(p2) - model.initCurrentStroke(p3, 51, "mouse", DefaultPenStyle) - expect(model.currentStroke).toBeDefined() - expect(model.rawStrokes).toHaveLength(1) - - model.clear() - expect(model.currentStroke).toBeUndefined() - expect(model.rawStrokes).toHaveLength(0) - }) - }) - -}) diff --git a/test/unit/03-renderer/00-QuadraticUtils.test.ts b/test/unit/03-renderer/00-QuadraticUtils.test.ts deleted file mode 100644 index aaae198a..00000000 --- a/test/unit/03-renderer/00-QuadraticUtils.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { TPointer } from "../../../src/@types" -import { quadradicsUtils } from "../../../src/iink" - -describe("QuadraticUtils.ts", () => -{ - const p1: TPointer = { - p: 1, - t: 1, - x: 1, - y: 1 - } - const p2: TPointer = { - p: 1, - t: 1, - x: 2, - y: 5 - } - test("should computeLinksPoints", () => - { - const points = quadradicsUtils.computeLinksPoints(p1, 90, 1) - expect(points).toStrictEqual([ - { - x: 0.10600333639944215, - y: 0.5519263838708298 - }, - { - x: 1.8939966636005579, - y: 1.4480736161291703 - } - ]) - }) - - test("should computeMiddlePoint", () => - { - const point = quadradicsUtils.computeMiddlePoint(p1, p2) - expect(point).toStrictEqual({ x: 1.5, y: 3, p: 1, t: 1 }) - }) - - test('should computeAxeAngle', () => - { - const angle = quadradicsUtils.computeAxeAngle(p1, p2) - expect(angle).toBe(1.3258176636680326) - }) - -}) diff --git a/test/unit/03-renderer/01-CanvasRenderer.test.ts b/test/unit/03-renderer/01-CanvasRenderer.test.ts deleted file mode 100644 index fff01fe0..00000000 --- a/test/unit/03-renderer/01-CanvasRenderer.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TRenderingConfiguration } from "../../../src/@types" -import { CanvasRenderer, CanvasStroker } from "../../../src/iink" - -describe("CanvasRenderer.ts", () => -{ - const height = 10, width = 10 - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = `${ height }px` - wrapperHTML.style.width = `${ width }px` - - const stroker = new CanvasStroker() - stroker.drawStroke = jest.fn() - - const conf: TRenderingConfiguration = { - minHeight: 100, - minWidth: 100, - smartGuide: { - enable: true, - fadeOut: { - enable: false, - duration: 100 - } - }, - guides: { - enable: true, - gap: 50 - } - } - const renderer = new CanvasRenderer(conf) - - test("should set configuration when instanciate", () => - { - const r = new CanvasRenderer(conf) - expect(r.config).toStrictEqual(conf) - }) - - test("should init", () => - { - renderer.init(wrapperHTML) - expect(wrapperHTML.querySelector(".ms-rendering-canvas")).toBeDefined() - expect(wrapperHTML.querySelector(".ms-capture-canvas")).toBeDefined() - expect(renderer.context).toBeDefined() - }) - - test("should destroy", () => - { - renderer.destroy() - expect(wrapperHTML.querySelector(".ms-rendering-canvas")).toBeNull() - expect(wrapperHTML.querySelector(".ms-capture-canvas")).toBeNull() - }) -}) diff --git a/test/unit/03-renderer/02-CanvasStroker.test.ts b/test/unit/03-renderer/02-CanvasStroker.test.ts deleted file mode 100644 index b84f61d2..00000000 --- a/test/unit/03-renderer/02-CanvasStroker.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Stroke, CanvasStroker, DefaultPenStyle } from "../../../src/iink" - -describe("CanvasStroker.ts", () => -{ - const canvas: HTMLCanvasElement = document.createElement("canvas") - - const context = { - canvas, - canvasContext: canvas.getContext("2d") as CanvasRenderingContext2D - } - - test("should instanciate CanvasStroker", () => - { - const stroker = new CanvasStroker() - expect(stroker).toBeDefined() - }) - - test("should drawStroke", () => - { - const stroker = new CanvasStroker() - const stroke = new Stroke(DefaultPenStyle, 1) - for (let i = 0; i < 5; i++) { - stroke.pointers.push({ - p: 0.5, - t: 1, - x: i, - y: i - }) - } - stroker.drawStroke(context.canvasContext, stroke) - }) - - -}) diff --git a/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts b/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts deleted file mode 100644 index 0ac2f933..00000000 --- a/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { TLineSymbol, TShapeSymbol } from "../../../src/@types" -import { DefaultPenStyle, canvasRendererShape } from "../../../src/iink" - -describe("CanvasRendererShapeSymbol.ts", () => -{ - const canvas: HTMLCanvasElement = document.createElement("canvas") - const canvasContext = canvas.getContext("2d") as CanvasRenderingContext2D - - canvasContext.moveTo = jest.fn() - canvasContext.lineTo = jest.fn() - const p1 = { x: 1, y: 2 } - const p2 = { x: 3, y: 4 } - - - test("should drawLine", () => - { - canvasRendererShape.drawLine(canvasContext, p1, p2) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) - - test("should drawShapeSymbol with type line", () => - { - const lineSymbol: TLineSymbol = { - elementType: "line", - type: "pen", - style: DefaultPenStyle, - data: { p1, p2 } - } - canvasRendererShape.drawShapeSymbol(canvasContext, lineSymbol) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) - - test("should drawShapeSymbol with type shape", () => - { - const lineSymbol: TLineSymbol = { - elementType: "line", - type: "pen", - style: DefaultPenStyle, - data: { p1, p2 } - } - const shapeSymbol: TShapeSymbol = { - elementType: "shape", - type: "pen", - style: DefaultPenStyle, - selectedCandidateIndex: 0, - candidates: [lineSymbol] - } - canvasRendererShape.drawShapeSymbol(canvasContext, shapeSymbol) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) -}) diff --git a/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts b/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts deleted file mode 100644 index a17554ad..00000000 --- a/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { TStroke } from "../../../src/@types" -import { DefaultPenStyle, CanvasStroker, canvasRendererStroke } from "../../../src/iink" - -describe("CanvasRendererStrokeSymbol.ts", () => -{ - const canvas: HTMLCanvasElement = document.createElement("canvas") - const canvasContext = canvas.getContext("2d") as CanvasRenderingContext2D - - canvasContext.moveTo = jest.fn() - canvasContext.lineTo = jest.fn() - const stroker = new CanvasStroker() - stroker.drawStroke = jest.fn() - - - test("should drawStroke", () => - { - //@ts-ignore - const stroke: TStroke = { - id: "test-id", - type: "pen", - pointerType: "pen", - pointerId: 0, - style: DefaultPenStyle, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - canvasRendererStroke.drawStroke(canvasContext, stroke, stroker) - expect(stroker.drawStroke).toBeCalledTimes(1) - expect(stroker.drawStroke).toBeCalledWith(canvasContext, stroke) - }) - - test("should not drawStroke if eraser", () => - { - //@ts-ignore - const stroke: TStroke = { - id: "test-id", - type: "pen", - pointerType: "eraser", - pointerId: 0, - style: DefaultPenStyle, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - canvasRendererStroke.drawStroke(canvasContext, stroke, stroker) - expect(stroker.drawStroke).toBeCalledTimes(0) - }) - - -}) diff --git a/test/unit/03-renderer/05-WSSVGRenderer.test.ts b/test/unit/03-renderer/05-WSSVGRenderer.test.ts deleted file mode 100644 index 7959b7e7..00000000 --- a/test/unit/03-renderer/05-WSSVGRenderer.test.ts +++ /dev/null @@ -1,530 +0,0 @@ -import { delay } from "../utils/helpers" -import -{ - TUpdatePatchAppendChild, - TUpdatePatchInsertBefore, - TUpdatePatchRemoveAttribut, - TUpdatePatchRemoveChild, - TUpdatePatchRemoveElement, - TUpdatePatchReplaceAll, - TUpdatePatchReplaceELement, - TUpdatePatchSetAttribut, - TStroke -} from "../../../src/@types" -import { DefaultRenderingConfiguration, DefaultPenStyle, Model, WSSVGRenderer } from "../../../src/iink" - -describe("WSSVGRenderer.ts", () => -{ - const stroke: TStroke = { - type: 'pen', - pointerType: 'pen', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - - test("should instanciate", () => - { - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - expect(renderer).toBeDefined() - expect(renderer.config).toStrictEqual(DefaultRenderingConfiguration) - expect(renderer.stroker).toBeDefined() - }) - - test("should initialise context", () => - { - const domElement = document.createElement("div") as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - expect(renderer.context.parent).toBe(domElement) - }) - - test("should updatesLayer when type = REPLACE_ALL on layer CAPTURE", () => - { - const domElement = document.createElement("div") as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: "REPLACE_ALL", - svg: '' - } - renderer.updatesLayer("CAPTURE", [update]) - - expect(domElement.children).toHaveLength(1) - const layerCapture = domElement.querySelector('svg[data-layer="CAPTURE"') - expect(layerCapture).toBeDefined() - }) - - test('should updatesLayer when type = REPLACE_ALL on layer MODEL', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - "type": "REPLACE_ALL", - svg: '' - } - renderer.updatesLayer('MODEL', [update]) - - expect(domElement.children).toHaveLength(1) - const layerCapture = domElement.querySelector('svg[data-layer="MODEL"') - expect(layerCapture).toBeDefined() - const pendingGroup = layerCapture?.querySelector('#pendingStrokes') - expect(pendingGroup).toBeDefined() - }) - - test('should updatesLayer when type = REPLACE_ELEMENT', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateReplaceElement: TUpdatePatchReplaceELement = { - type: 'REPLACE_ELEMENT', - id: "CAPTURE-ps0", - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateReplaceElement]) - - const parendNode = domElement.querySelector('svg[data-layer="CAPTURE"]') - expect(parendNode?.children).toHaveLength(1) - - const elementReplaced = domElement.querySelector(`#${ updateReplaceElement.id }`) - expect(parendNode?.children.item(0)).toBe(elementReplaced) - }) - - test('should updatesLayer when type = REMOVE_ELEMENT on layer CAPTURE', async () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - let elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove).toBeDefined() - - const updateRemove: TUpdatePatchRemoveElement = { - type: 'REMOVE_ELEMENT', - id: 'CAPTURE-dg7f8d807ab560' - } - renderer.updatesLayer('MODEL', [updateRemove]) - elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove?.classList).toContain('removed-stroke') - - await delay(100) - elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove).toBeNull() - }) - - test('should updatesLayer when type = REMOVE_ELEMENT on layer MODEL', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('MODEL', [update]) - let elementToRemove = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(elementToRemove).toBeDefined() - - const updateRemove: TUpdatePatchRemoveElement = { - type: 'REMOVE_ELEMENT', - id: 'MODEL-dg7f8d807ab560' - } - renderer.updatesLayer('MODEL', [updateRemove]) - elementToRemove = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(elementToRemove).toBeNull() - }) - - test('should updatesLayer when type = APPEND_CHILD with parentId', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - ` - } - renderer.updatesLayer('MODEL', [update]) - - const updateAppendChild: TUpdatePatchAppendChild = { - type: "APPEND_CHILD", - parentId: "MODEL-dg7f8d807ab560", - svg: '' - } - renderer.updatesLayer('MODEL', [updateAppendChild]) - - const parendNode = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(parendNode?.children).toHaveLength(1) - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children.item(0)).toBe(elementInserted) - }) - - test('should updatesLayer when type = APPEND_CHILD without parentId', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateAppendChild: TUpdatePatchAppendChild = { - type: "APPEND_CHILD", - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateAppendChild]) - - const parendNode = domElement.querySelector('svg') - expect(parendNode?.children).toHaveLength(2) - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children.item(1)).toBe(elementInserted) - }) - - test('should updatesLayer when type = REMOVE_CHILD', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - - - ` - } - renderer.updatesLayer('MODEL', [update]) - - const updateRmoveChild: TUpdatePatchRemoveChild = { - type: 'REMOVE_CHILD', - parentId: 'MODEL-dg7f6394110df0', - index: 2 - } - renderer.updatesLayer('MODEL', [updateRmoveChild]) - - const parendNode = domElement.querySelector(`#${ updateRmoveChild.parentId }`) - expect(parendNode?.children).toHaveLength(2) - }) - - test('should updatesLayer when type = INSERT_BEFORE', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateInsertBefore: TUpdatePatchInsertBefore = { - type: 'INSERT_BEFORE', - refId: 'CAPTURE-pc9a1234856ze6', - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateInsertBefore]) - - const parendNode = domElement.querySelector('#CAPTURE-dg7f6394110df0') - expect(parendNode?.children).toHaveLength(2) - - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children?.item(0)).toBe(elementInserted) - }) - - test('should updatesLayer when type = SET_ATTRIBUTE with id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateSetAttribut: TUpdatePatchSetAttribut = { - type: 'SET_ATTRIBUTE', - id: 'CAPTURE-pc9a1234856ze6', - name: 'data-test', - value: 'value-test' - } - renderer.updatesLayer('CAPTURE', [updateSetAttribut]) - - const element = domElement.querySelector(`#${ updateSetAttribut.id }`) - expect(element?.getAttribute(updateSetAttribut.name)).toBe(updateSetAttribut.value) - }) - - test('should updatesLayer when type = SET_ATTRIBUTE without id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateSetAttribut: TUpdatePatchSetAttribut = { - type: 'SET_ATTRIBUTE', - name: 'data-test', - value: 'value-test' - } - renderer.updatesLayer('CAPTURE', [updateSetAttribut]) - - const element = domElement.querySelector('svg') - expect(element?.getAttribute(updateSetAttribut.name)).toBe(updateSetAttribut.value) - }) - - test('should updatesLayer when type = REMOVE_ATTRIBUTE with id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateRemoveAttribut: TUpdatePatchRemoveAttribut = { - type: 'REMOVE_ATTRIBUTE', - id: 'CAPTURE-pc9a1234856ze6', - name: 'data-test', - } - renderer.updatesLayer('CAPTURE', [updateRemoveAttribut]) - - const element = domElement.querySelector(updateRemoveAttribut.id as string) - expect(element?.getAttribute(updateRemoveAttribut.name)).toBeUndefined() - }) - - test('should updatesLayer when type = REMOVE_ATTRIBUTE without id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateRemoveAttribut: TUpdatePatchRemoveAttribut = { - type: 'REMOVE_ATTRIBUTE', - name: 'data-test', - } - renderer.updatesLayer('CAPTURE', [updateRemoveAttribut]) - - const element = domElement.querySelector('svg') - expect(element?.getAttribute(updateRemoveAttribut.name)).toBeNull() - }) - - test('should drawPendingStroke', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - renderer.drawPendingStroke(stroke) - - expect(renderer.stroker.drawStroke).toBeCalledTimes(1) - expect(renderer.stroker.drawStroke).toBeCalledWith(pendingStrokesGroup, stroke, [{ name: "style", value: "fill:undefined;stroke:transparent;" }]) - }) - - test('should drawPendingStroke when pointerType = eraser', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const eraseStroke: TStroke = { - type: 'pen', - pointerType: 'eraser', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - renderer.drawPendingStroke(eraseStroke) - - expect(renderer.stroker.drawStroke).toBeCalledTimes(1) - expect(renderer.stroker.drawStroke).toBeCalledWith(pendingStrokesGroup, eraseStroke, [{ name: "style", value: "fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;" }]) - }) - - test('should clearPendingStroke', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgCaptureElement.setAttribute('data-layer', 'CAPTURE') - domElement.appendChild(svgCaptureElement) - - renderer.drawPendingStroke(stroke) - expect(pendingStrokesGroup.children).toHaveLength(1) - - renderer.clearPendingStroke() - - expect(pendingStrokesGroup.children).toHaveLength(0) - }) - - test('should resize', () => - { - const width = 100, height = 50 - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - const model = new Model(width, height) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - svgModelElement.setAttribute('viewBox', `0 0 ${ width }, ${ height }`) - svgModelElement.setAttribute('width', `${ width }px`) - svgModelElement.setAttribute('height', `${ height }px`) - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgCaptureElement.setAttribute('data-layer', 'CAPTURE') - svgCaptureElement.setAttribute('viewBox', `0 0 ${ width }, ${ height }`) - svgCaptureElement.setAttribute('width', `${ width }px`) - svgCaptureElement.setAttribute('height', `${ height }px`) - domElement.appendChild(svgCaptureElement) - - model.width += 42 - model.height += 50 - renderer.resize(model) - - expect(svgCaptureElement.getAttribute('width')).toBe(`${ model.width }px`) - expect(svgCaptureElement.getAttribute('height')).toBe(`${ model.height }px`) - }) - - test('should destroy', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - domElement.appendChild(svgCaptureElement) - - renderer.destroy() - - expect(domElement.children).toHaveLength(0) - }) -}) diff --git a/test/unit/03-renderer/06-SVGStroker.test.ts b/test/unit/03-renderer/06-SVGStroker.test.ts deleted file mode 100644 index f193c71f..00000000 --- a/test/unit/03-renderer/06-SVGStroker.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { TStroke } from "../../../src/@types" -import { SVGStroker } from "../../../src/iink" - -describe("SVGStroker.ts", () => -{ - //@ts-ignore - const stroke: TStroke = { - type: "pen", - pointerType: "pen", - pointerId: 0, - id: "test", - style: { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "none", - "-myscript-pen-width": 1, - color: "red", - width: 1, - }, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - - test("should instanciate", () => - { - const stroker = new SVGStroker() - expect(stroker).toBeDefined() - }) - - test("should drawStroke", () => - { - const svgElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGElement - const stroker = new SVGStroker() - stroker.drawStroke(svgElement, stroke) - const pathElement = svgElement.querySelector("path") - expect(pathElement?.getAttribute("id")).toEqual(stroke.id) - expect(pathElement?.getAttribute("type")).toEqual("stroke") - }) - - test("should drawStroke with attrs", () => - { - const svgElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGElement - const stroker = new SVGStroker() - stroker.drawStroke(svgElement, stroke, [{ name: "style", value: `fill:${ stroke.style.color };stroke:transparent;` }]) - const pathElement = svgElement.querySelector("path") - expect(pathElement?.getAttribute("id")).toEqual(stroke.id) - expect(pathElement?.getAttribute("type")).toEqual("stroke") - expect(pathElement?.getAttribute("style")).toEqual(`fill:${ stroke.style.color };stroke:transparent;`) - }) -}) diff --git a/test/unit/04-style/00-StyleHelper.test.ts b/test/unit/04-style/00-StyleHelper.test.ts deleted file mode 100644 index 93377487..00000000 --- a/test/unit/04-style/00-StyleHelper.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { TPenStyle, TTheme } from "../../../src/@types" -import { StyleHelper, DefaultPenStyle, DefaultTheme } from "../../../src/iink" - -const DefaultPenStyleString = "" -const DefaultThemeString = `ink {color: #000000;width: 1;-myscript-pen-width: 1;-myscript-pen-fill-style: none;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: #A8A8A8FF;}.text {font-family: MyScriptInter;font-size: 10;}` - -describe("StyleHelper.ts", () => -{ - test("should penStyleToCSS for DefaultPenStyle", () => - { - const styleString = StyleHelper.penStyleToCSS(DefaultPenStyle) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - expect(styleStringInline).toEqual(DefaultPenStyleString) - }) - - test("should penStyleToCSS for customPenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "none", - "-myscript-pen-width": 1, - color: "green", - width: 2 - } - const penStyleStringExpected = `-myscript-pen-fill-color: red;-myscript-pen-fill-style: none;-myscript-pen-width: 1;color: green;width: 2;` - - const styleString = StyleHelper.penStyleToCSS(penStyle) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - - expect(styleStringInline).toEqual(penStyleStringExpected) - }) - - test("should penStyleToJSON for DefaultPenStyle", () => - { - const style = StyleHelper.penStyleToJSON(DefaultPenStyleString) - expect(style).toEqual(DefaultPenStyle) - }) - - test("should penStyleToJSON for customPenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "purple", - "-myscript-pen-width": 1, - color: "green", - width: 2 - } - const penStyleString = `-myscript-pen-fill-color: red;-myscript-pen-fill-style: purple;-myscript-pen-width: 1;color: green;width: 2;` - const style = StyleHelper.penStyleToJSON(penStyleString) - expect(style).toEqual(penStyle) - }) - - test("should themeToCSS for DefaultTheme", () => - { - const styleString = StyleHelper.themeToCSS(DefaultTheme) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - expect(styleStringInline).toStrictEqual(DefaultThemeString) - }) - - test("should themeToCSS for CustomTheme", () => - { - const theme: TTheme = { - ink: { - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - const themeStringExpected = "ink {color: #2E7D32;-myscript-pen-width: 2;-myscript-pen-fill-style: purple;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: blue;}.text {font-family: Rubik Distressed;font-size: 10;}" - const themeString = StyleHelper.themeToCSS(theme) - const themeStringInline = themeString.replace(/[\r\n]+/gm, "") - expect(themeStringInline).toStrictEqual(themeStringExpected) - }) - - test("should themeToJSON for DefaultTheme", () => - { - const style = StyleHelper.themeToJSON(DefaultThemeString) - expect(style).toStrictEqual(DefaultTheme) - }) - - test("should themeToJSON for v", () => - { - const theme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - const themeString = "ink {width: 42;color: #2E7D32;-myscript-pen-width: 2;-myscript-pen-fill-style: purple;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: blue;}.text {font-family: Rubik Distressed;font-size: 10;}" - - const style = StyleHelper.themeToJSON(themeString) - expect(style).toStrictEqual(theme) - }) -}) diff --git a/test/unit/04-style/01-StyleManager.test.ts b/test/unit/04-style/01-StyleManager.test.ts deleted file mode 100644 index a2c1b39c..00000000 --- a/test/unit/04-style/01-StyleManager.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { StyleManager, DefaultPenStyle, DefaultTheme } from "../../../src/iink" - -describe("StyleManager.ts", () => -{ - - describe("constructor", () => - { - test("should instanciate with DefaultPenStyle & DefaultTheme", () => - { - const styleManager = new StyleManager() - expect(styleManager.penStyle).toStrictEqual(DefaultPenStyle) - expect(styleManager.theme).toStrictEqual(DefaultTheme) - }) - test("should instanciate and override DefaultPenStyle", () => - { - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - const styleManager = new StyleManager(customPenStyle, undefined) - expect(styleManager.penStyle).toStrictEqual(customPenStyle) - }) - test("should instanciate and override DefaultTheme", () => - { - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - const styleManager = new StyleManager(undefined, customTheme) - expect(styleManager.theme).toStrictEqual(customTheme) - }) - }) - - describe("penStyle", () => - { - test("should override DefaultPenStyle", () => - { - const styleManager = new StyleManager() - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - styleManager.setPenStyle(customPenStyle) - expect(styleManager.penStyle).toStrictEqual(customPenStyle) - }) - - test("should define currentPenStyle", () => - { - const styleManager = new StyleManager() - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - styleManager.setPenStyle(customPenStyle) - expect(styleManager.currentPenStyle).toStrictEqual(customPenStyle) - }) - }) - - describe("theme", () => - { - test("should override DefaultTheme", () => - { - const styleManager = new StyleManager() - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - styleManager.setTheme(customTheme) - expect(styleManager.theme).toStrictEqual(customTheme) - }) - }) - - describe("penStyleClasses", () => - { - test("should set penStyleClasses", () => - { - const styleManager = new StyleManager() - styleManager.setPenStyleClasses("pouet") - expect(styleManager.penStyleClasses).toStrictEqual("pouet") - }) - test("should define currentPenStyle", () => - { - const styleManager = new StyleManager() - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - styleManager.setPenStyleClasses("math") - expect(styleManager.currentPenStyle).toStrictEqual(customTheme[".math"]) - }) - }) - - -}) diff --git a/test/unit/05-recognizer/00-CryptoHelper.test.ts b/test/unit/05-recognizer/00-CryptoHelper.test.ts deleted file mode 100644 index 7eb96b26..00000000 --- a/test/unit/05-recognizer/00-CryptoHelper.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { computeHmac } from "../../../src/iink" - -describe("CryptoHelper.ts", () => -{ - test("should computeHmac", () => - { - const computedHmac = computeHmac("Message", "AppKey", "HMACKey") - expect(computedHmac) - .toBe("b4d62a1900a4010a140e31fc4a07b6445499e6c7488f3214962427b2d539056182d0990f4d042ace794704f03dc6fdc2f73e25dd6ea35d3e0fd537d1dd4c1223") - }) - -}) diff --git a/test/unit/05-recognizer/01-RestRecognizer.test.ts b/test/unit/05-recognizer/01-RestRecognizer.test.ts deleted file mode 100644 index 9ee6cacc..00000000 --- a/test/unit/05-recognizer/01-RestRecognizer.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import fetchMock from "jest-fetch-mock" -import -{ - IModel, - TPointer, - TRecognitionConfiguration, - TRecognitionType -} from "../../../src/@types" -import -{ - DefaultRecognitionConfiguration, - DefaultServerConfiguration, - DefaultPenStyle, - RestRecognizer, - Model -} from "../../../src/iink" - -describe("RestRecognizer.ts", () => -{ - const height = 100, width = 100 - - beforeAll(() => - { - fetchMock.enableMocks() - }) - afterEach(() => - { - fetchMock.resetMocks() - }) - - test("should instanciate RestRecognizer", () => - { - const rr = new RestRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - expect(rr).toBeDefined() - }) - - const recognitionTypeList: TRecognitionType[] = ["TEXT", "DIAGRAM", "MATH", "Raw Content"] - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should export ${ recognitionType }`, async () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const rr = new RestRecognizer(DefaultServerConfiguration, recognitionConfig) - const newModel = await rr.export(model) - model.exports = {} - - let mimeType = "" - switch (recognitionType) { - case "TEXT": - mimeType = DefaultRecognitionConfiguration.text.mimeTypes[0] - break - case "DIAGRAM": - mimeType = DefaultRecognitionConfiguration.diagram.mimeTypes[0] - break - case "MATH": - mimeType = DefaultRecognitionConfiguration.math.mimeTypes[0] - break - case "Raw Content": - mimeType = "application/vnd.myscript.jiix" - break - - default: - throw new Error("invalid recognition type") - } - expect(fetchMock).toHaveBeenCalledTimes(1) - model.exports[mimeType] = "" - expect(newModel).toEqual(model) - }) - }) - - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should convert ${ recognitionType }`, async () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const rr = new RestRecognizer(DefaultServerConfiguration, recognitionConfig) - const newModel = await rr.convert(model, "DIGITAL_EDIT") - model.converts = {} - - let mimeType = "" - switch (recognitionType) { - case "TEXT": - mimeType = DefaultRecognitionConfiguration.text.mimeTypes[0] - break - case "DIAGRAM": - mimeType = DefaultRecognitionConfiguration.diagram.mimeTypes[0] - break - case "MATH": - mimeType = DefaultRecognitionConfiguration.math.mimeTypes[0] - break - case "Raw Content": - mimeType = "application/vnd.myscript.jiix" - break - - default: - throw new Error("invalid recognition type") - } - - expect(fetchMock).toHaveBeenCalledTimes(1) - model.converts[mimeType] = "" - expect(model).toEqual(newModel) - }) - }) - -}) diff --git a/test/unit/05-recognizer/02-WSRecognizer.test.ts b/test/unit/05-recognizer/02-WSRecognizer.test.ts deleted file mode 100644 index 15275181..00000000 --- a/test/unit/05-recognizer/02-WSRecognizer.test.ts +++ /dev/null @@ -1,1060 +0,0 @@ -import Server from "jest-websocket-mock" -import { DeserializedMessage } from "jest-websocket-mock/lib/websocket" -import { delay } from "../utils/helpers" -import -{ - TWebSocketEvent, - IModel, - TTheme, - TPenStyle, - TServerConfiguration, - TConverstionState, - TRecognitionConfiguration, - TRecognitionType, - TPointer, -} from "../../../src/@types" -import -{ - DefaultRecognitionConfiguration, - DefaultServerConfiguration, - WSRecognizer, - Model, - DefaultPenStyle, - Constants, -} from "../../../src/iink" - -const ackMessage = { "type": "ack", "hmacChallenge": "1f434e8b-cc46-4a8c-be76-708eea2ff305", "iinkSessionId": "c7e72186-6299-4782-b612-3e725aa126f1" } -const contentPackageDescriptionMessage = { "type": "contentPackageDescription", "contentPartCount": 0 } -const partChangeMessage = { "type": "partChanged", "partIdx": 0, "partId": "yyrrutgk", "partCount": 1 } -const newPartMessage = { "type": "newPart", "idx": 0, "id": "lqrcoxjl" } - -const emptyJIIX = { - "type": "Text", - "label": "", - "words": [], -} -const emptyExportedMessage = { - "type": "exported", - "partId": "wyybaqsp", - "exports": { - "application/vnd.myscript.jiix": JSON.stringify(emptyJIIX) - } -} -const hJIIX = { - "type": "Text", - "label": "hello", - "words": [{ - "label": "H", - "candidates": ["h"] - }] -} -const hExportedMessage = { - "type": "exported", - "partid": 0, - "exports": { - "application/vnd.myscript.jiix": JSON.stringify(hJIIX) - } -} -const svgPatchMessage = { - "type": "svgPatch", - "updates": [ - { - "type": "REMOVE_ELEMENT", - "id": "MODEL-dg7f8894033c80" - }, - { - "type": "SET_ATTRIBUTE", - "name": "viewBox", - "value": "0 0 967 790" - }, - { - "type": "SET_ATTRIBUTE", - "name": "width", - "value": "967px" - }, - { - "type": "INSERT_BEFORE", - "refId": "G7f8814290820-", - "svg": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" - }, - { - "type": "REMOVE_ELEMENT", - "id": "G7f8814290820-" - } - ], - "layer": "MODEL" -} -const errorMessage = { "type": "error", "message": "Access not granted", "code": "access.not.granted" } -const recognitionTypeList: TRecognitionType[] = ["TEXT", "DIAGRAM", "MATH", "Raw Content"] - -const getMessages = (messages: DeserializedMessage[], type: string): DeserializedMessage[] => -{ - return messages.filter((m: DeserializedMessage) => - { - const parseMessage = JSON.parse(m as string) as TWebSocketEvent - return parseMessage.type === type - }) -} - -describe("WSRecognizer.ts", () => -{ - let mockServer: Server - const height = 100, width = 100 - beforeEach(() => - { - mockServer = new Server(`wss://${ DefaultServerConfiguration.host }/api/v4.0/iink/document`, {}) - - mockServer.on("connection", (socket) => - { - socket.on("message", (message: string | Blob | ArrayBuffer | ArrayBufferView) => - { - const parsedMessage: TWebSocketEvent = JSON.parse(message as string) - switch (parsedMessage.type) { - case "newContentPackage": - socket.send(JSON.stringify(ackMessage)) - break - case "hmac": - socket.send(JSON.stringify(contentPackageDescriptionMessage)) - break - case "configuration": - socket.send(JSON.stringify(partChangeMessage)) - break - case "newContentPart": - socket.send(JSON.stringify(newPartMessage)) - break - default: - break - } - }) - }) - }) - - afterEach(() => - { - Server.clean() - }) - - test("should instanciate WSRecognizer", () => - { - const wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - expect(wsr).toBeDefined() - }) - - describe("Properties", () => - { - test("should get url", () => - { - const serverConfig = { - ...DefaultServerConfiguration, - scheme: "http", - host: "pony", - applicationKey: "applicationKey" - } as TServerConfiguration - const wsr = new WSRecognizer(serverConfig, DefaultRecognitionConfiguration) - expect(wsr.url).toEqual("ws://pony/api/v4.0/iink/document?applicationKey=applicationKey") - }) - recognitionTypeList.forEach(recognitionType => - { - test(`should get mimeTypes for ${ recognitionType }`, () => - { - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const wsr = new WSRecognizer(DefaultServerConfiguration, recognitionConfig) - let mimeTypes: string[] - switch (recognitionType) { - case "TEXT": - mimeTypes = recognitionConfig.text.mimeTypes - break - case "DIAGRAM": - mimeTypes = recognitionConfig.diagram.mimeTypes - break - case "MATH": - mimeTypes = recognitionConfig.math.mimeTypes - break - case "Raw Content": - mimeTypes = [] - break - default: - throw new Error("invalid recognition type") - } - expect(wsr.mimeTypes).toEqual(mimeTypes) - }) - }) - }) - - describe("init", () => - { - const serverConfigToCloseTest: TServerConfiguration = { - ...DefaultServerConfiguration, - host: "init-test" - } - let addStroMockServerForInitTest: Server - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - - beforeEach(() => - { - addStroMockServerForInitTest = new Server(`wss://${ serverConfigToCloseTest.host }/api/v4.0/iink/document`, {}) - wsr = new WSRecognizer(serverConfigToCloseTest, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - spyEmitError.mockResolvedValue(() => Promise.resolve()) - }) - afterEach(async () => - { - await wsr.destroy() - addStroMockServerForInitTest.close() - }) - test("should sent newContentPackage message", async () => - { - expect.assertions(2) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPackage")).toHaveLength(0) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPackage")).toHaveLength(1) - }) - test("should sent hmac message when receive hmacChallenge message", async () => - { - expect.assertions(2) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "hmac")).toHaveLength(0) - addStroMockServerForInitTest.send(JSON.stringify(ackMessage)) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "hmac")).toHaveLength(1) - }) - test("should sent hmac & newPart messages when receive hmacChallenge message", async () => - { - expect.assertions(4) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "configuration")).toHaveLength(0) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPart")).toHaveLength(0) - addStroMockServerForInitTest.send(JSON.stringify(contentPackageDescriptionMessage)) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "configuration")).toHaveLength(1) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPart")).toHaveLength(1) - }) - test.skip("should resolve when receive newPart message", async () => - { - expect.assertions(1) - const promise = wsr.init(height, width) - addStroMockServerForInitTest.send(JSON.stringify(newPartMessage)) - await promise - expect(1).toEqual(1) - }) - test.skip("should reject if receive error message", async () => - { - expect.assertions(3) - const promise = wsr.init(height, width) - addStroMockServerForInitTest.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Ping", () => - { - test("should send ping message", async () => - { - expect.assertions(2) - const conf = JSON.parse(JSON.stringify(DefaultServerConfiguration)) as TServerConfiguration - conf.websocket.pingDelay = 200 - const wsr = new WSRecognizer(conf, DefaultRecognitionConfiguration) - await wsr.init(height, width) - await delay(conf.websocket.pingDelay) - await delay(100) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(1) - await delay(conf.websocket.pingDelay) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(2) - }) - test("should not send ping message", async () => - { - expect.assertions(2) - const conf = JSON.parse(JSON.stringify(DefaultServerConfiguration)) as TServerConfiguration - conf.websocket.pingDelay = 200 - conf.websocket.pingEnabled = false - const wsr = new WSRecognizer(conf, DefaultRecognitionConfiguration) - await wsr.init(height, width) - await delay(conf.websocket.pingDelay) - await delay(100) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(0) - await delay(conf.websocket.pingDelay) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(0) - }) - }) - - describe("send", () => - { - let wsr: WSRecognizer - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - const testDataToSend = { type: "test", data: "test-data" } - await expect(wsr.send(testDataToSend)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const testDataToSend = { type: "test", data: "test-data" } - await wsr.send(testDataToSend) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const messageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - expect(messageSent).toEqual(testDataToSend) - }) - //TODO fix test - test.skip("should reconnect before send message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - await wsr.close(1000, "CLOSE_RECOGNIZER") - const testDataToSend = { type: "test", data: "test-data" } - await wsr.send(testDataToSend) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const messageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - expect(messageSent).toEqual(testDataToSend) - }) - }) - - describe("addStrokes", () => - { - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - const model = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - await expect(wsr.addStrokes(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send addStrokes message", async () => - { - expect.assertions(1) - const model = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - await wsr.init(height, width) - wsr.addStrokes(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const addStrokesMessageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - const addStrokesMessageSentToTest = { - type: "addStrokes", - strokes: [{ - "p": [0.88, 0.07], - "pointerType": "pen", - "t": [1, 10], - "x": [1, 100], - "y": [1, 1], - }] - } - await expect(addStrokesMessageSent).toMatchObject(addStrokesMessageSentToTest) - }) - test("should not send addStrokes message if model.extractUnsentStrokes return 0 strokes", async () => - { - expect.assertions(1) - const emptyModel: IModel = new Model(width, height) - await wsr.init(height, width) - await wsr.addStrokes(emptyModel) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const addStrokesMessageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - await expect(addStrokesMessageSent.type).not.toEqual("addStrokes") - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - const model = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - await wsr.init(height, width) - const promise = wsr.addStrokes(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await promise - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - const model = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - await wsr.init(height, width) - const promise = wsr.addStrokes(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Style", () => - { - let wsr: WSRecognizer - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should setPenStyle", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const CustomPenStyle: TPenStyle = { color: "#d1d1d1" } - await wsr.setPenStyle(CustomPenStyle) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const setPenStyle = mockServer.messages[mockServer.messages.length - 1] - const setPenStyleToTest = JSON.stringify({ - type: "setPenStyle", - style: "color: #d1d1d1;" - }) - expect(setPenStyle).toContain(setPenStyleToTest) - }) - test("should setPenStyleClasses", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const styleClasses = "pony" - await wsr.setPenStyleClasses(styleClasses) - await delay(100) - //¯\_(ツ)_/¯ required to wait server received message - const setPenStyleClasses = mockServer.messages[mockServer.messages.length - 1] - const setPenStyleClassesToTest = JSON.stringify({ - type: "setPenStyleClasses", - styleClasses - }) - expect(setPenStyleClasses).toContain(setPenStyleClassesToTest) - }) - test("should setTheme", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const theme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - await wsr.setTheme(theme) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - - const setThemeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const setThemeMessageSentToTest = "{\"type\":\"setTheme\",\"theme\":\"ink {\\nwidth: 42;\\ncolor: #2E7D32;\\n-myscript-pen-width: 2;\\n-myscript-pen-fill-style: purple;\\n-myscript-pen-fill-color: #FFFFFF00;\\n}\\n.math {\\nfont-family: STIXGeneral;\\n}\\n.math-solved {\\nfont-family: STIXGeneral;\\ncolor: blue;\\n}\\n.text {\\nfont-family: Rubik Distressed;\\nfont-size: 10;\\n}\\n\"}" - expect(setThemeMessageSent).toContain(setThemeMessageSentToTest) - }) - }) - - describe("export", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.export(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should send export message for ${ recognitionType }`, async () => - { - expect.assertions(1) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const my_wsr = new WSRecognizer(DefaultServerConfiguration, recognitionConfig) - await my_wsr.init(height, width) - my_wsr.export(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const exportMessageSent = mockServer.messages[mockServer.messages.length - 1] - let mimeTypes: string[] - switch (recognitionType) { - case "TEXT": - mimeTypes = DefaultRecognitionConfiguration.text.mimeTypes - break - case "DIAGRAM": - mimeTypes = DefaultRecognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = DefaultRecognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - default: - throw new Error("invalid recognition type") - } - - const exportMessageSentToTest = JSON.stringify({ - type: "export", - partId: partChangeMessage.partId, - mimeTypes - }) - expect(exportMessageSent).toContain(exportMessageSentToTest) - my_wsr.destroy() - }) - }) - test("should resolve when receive fileChunckAck message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.export(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(hExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": hJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.export(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("import", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - const mimeType = "text/plain" - const textImport = "winter is comming" - const blobToImport = new Blob([textImport]) - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - await expect(wsr.import(model, blobToImport, mimeType)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send import message", async () => - { - await wsr.init(height, width) - wsr.import(model, blobToImport, mimeType) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const parsedMessage = mockServer.messages.map((m: DeserializedMessage) => - { - return JSON.parse(m as string) as TWebSocketEvent - }) - await expect(parsedMessage.filter(m => m.type === "importFile")).toHaveLength(1) - await expect(parsedMessage.filter(m => m.type === "importFile")[0]).toEqual( - expect.objectContaining({ - type: "importFile", - mimeType - }) - ) - await expect(parsedMessage.filter(m => m.type === "fileChunk")).toHaveLength(1) - await expect(parsedMessage.filter(m => m.type === "fileChunk")[0]).toEqual( - expect.objectContaining({ - type: "fileChunk", - data: textImport - }) - ) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.import(model, blobToImport, mimeType) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.import(model, blobToImport, mimeType) - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("resize", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.resize(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send resize message", async () => - { - expect.assertions(1) - model.height = 27 - model.width = 5 - await wsr.init(height, width) - wsr.resize(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "changeViewSize", height: model.height, width: model.width }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive svg patch message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.resize(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(svgPatchMessage)) - await expect(promise).resolves.toEqual(model) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.resize(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("convert", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.convert(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send convert message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const conversionState: TConverstionState = "DIGITAL_EDIT" - wsr.convert(model, conversionState) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "convert", conversionState }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.convert(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - converts: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.convert(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("undo", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.undo(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send undo message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.undo(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "undo" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.undo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.undo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("redo", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.redo(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send redo message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.redo(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "redo" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.redo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.redo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("clear", () => - { - const model: IModel = new Model(width, height) - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.clear(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send clear message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.clear(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "clear" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.clear(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.clear(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(Constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(Constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Connection lost", () => - { - const serverConfigToCloseTest: TServerConfiguration = { - ...DefaultServerConfiguration, - host: "close-test" - } - let mockServerForCloseTest: Server - let wsr: WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(() => - { - mockServerForCloseTest = new Server(`wss://${ serverConfigToCloseTest.host }/api/v4.0/iink/document`, {}) - mockServerForCloseTest.on("connection", (socket) => - { - socket.on("message", (message: string | Blob | ArrayBuffer | ArrayBufferView) => - { - const parsedMessage: TWebSocketEvent = JSON.parse(message as string) - switch (parsedMessage.type) { - case "newContentPackage": - socket.send(JSON.stringify(ackMessage)) - break - case "hmac": - socket.send(JSON.stringify(contentPackageDescriptionMessage)) - break - case "configuration": - socket.send(JSON.stringify(partChangeMessage)) - break - case "newContentPart": - socket.send(JSON.stringify(newPartMessage)) - break - default: - break - } - }) - }) - wsr = new WSRecognizer(serverConfigToCloseTest, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - spyEmitError.mockReset() - await wsr.destroy() - }) - const closeMessageOptions = [ - { code: 1001, message: Constants.Error.GOING_AWAY }, - { code: 1002, message: Constants.Error.PROTOCOL_ERROR }, - { code: 1003, message: Constants.Error.UNSUPPORTED_DATA }, - { code: 1006, message: Constants.Error.ABNORMAL_CLOSURE }, - { code: 1007, message: Constants.Error.INVALID_FRAME_PAULOAD }, - { code: 1008, message: Constants.Error.POLICY_VIOLATION }, - { code: 1009, message: Constants.Error.MESSAGE_TOO_BIG }, - { code: 1011, message: Constants.Error.INTERNAL_ERROR }, - { code: 1012, message: Constants.Error.SERVICE_RESTART }, - { code: 1013, message: Constants.Error.TRY_AGAIN }, - { code: 1014, message: Constants.Error.BAD_GATEWAY }, - { code: 1015, message: Constants.Error.TLS_HANDSHAKE }, - { code: 42, message: Constants.Error.CANT_ESTABLISH }, - ] - closeMessageOptions.forEach(async (closeEvent) => - { - test(`should emit error if the server closes the connection abnormally code == ${ closeEvent.code }`, async () => - { - expect.assertions(2) - await wsr.init(height, width) - mockServerForCloseTest.server.close({ code: closeEvent.code, reason: closeEvent.message, wasClean: false }) - expect(spyEmitError).toHaveBeenCalledTimes(1) - expect(spyEmitError).toHaveBeenCalledWith(new Error(closeEvent.message)) - }) - }) - }) - - describe("destroy", () => - { - test("should close socket", async () => - { - expect.assertions(2) - const wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - await wsr.init(height, width) - // 1 -> OPEN - await expect(mockServer.server.clients()[0].readyState).toEqual(1) - wsr.destroy() - // 2 -> CLOSING - await expect(mockServer.server.clients()[0].readyState).toEqual(2) - }) - }) -}) diff --git a/test/unit/06-undo-redo/00-UndoRedoContext.test.ts b/test/unit/06-undo-redo/00-UndoRedoContext.test.ts deleted file mode 100644 index f1c55bf4..00000000 --- a/test/unit/06-undo-redo/00-UndoRedoContext.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UndoRedoContext, Model } from "../../../src/iink" - -describe("UndoRedoContext.ts", () => -{ - const width = 100, height = 100 - test("should instanciate UndoRedoContext", () => - { - const context = new UndoRedoContext(new Model(width, height)) - expect(context).toBeDefined() - }) - - test("should be initialize", () => - { - const model = new Model(width, height) - const context = new UndoRedoContext(model) - - expect(context.stackIndex).toStrictEqual(0) - - expect(context.stack).toHaveLength(1) - expect(context.stack[context.stackIndex]).toEqual(model) - expect(context.stack[context.stackIndex]).not.toBe(model) - - expect(context.canUndo).toStrictEqual(false) - expect(context.canUndo).toStrictEqual(false) - }) -}) diff --git a/test/unit/06-undo-redo/01-UndoRedoManager.test.ts b/test/unit/06-undo-redo/01-UndoRedoManager.test.ts deleted file mode 100644 index 3839ef16..00000000 --- a/test/unit/06-undo-redo/01-UndoRedoManager.test.ts +++ /dev/null @@ -1,241 +0,0 @@ -import -{ - IModel, - TPointer, - TUndoRedoConfiguration -} from "../../../src/@types" -import -{ - Model, - UndoRedoManager, - UndoRedoContext, - DefaultConfiguration, - DefaultPenStyle -} from "../../../src/iink" - -describe("UndoRedoManager.ts", () => -{ - const width = 100, height = 100 - test("should instanciate UndoRedoManager", () => - { - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], new Model(width, height)) - expect(manager).toBeDefined() - }) - - test("should initialize UndoRedoContext", () => - { - const model = new Model(width, height) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - const context = new UndoRedoContext(model) - expect(manager.context).toStrictEqual(context) - }) - - describe("addModelToStack", () => - { - const configuration: TUndoRedoConfiguration = { maxStackSize: 5 } - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(configuration, model) - - test("should add model to stack", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - - test("should splice end of stack if stackIndex no last", () => - { - const NB_STROKE = 4 - for (let i = 0; i < NB_STROKE; i++) { - const p1: TPointer = { t: i * 5, p: 1, x: i * 10, y: 10 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: i * 10, p: 1, x: i * 10, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - } - expect(manager.context.stackIndex).toStrictEqual(NB_STROKE) - expect(manager.context.stack).toHaveLength(NB_STROKE + 1) - - manager.context.stackIndex = 0 - - const p1: TPointer = { t: 27, p: 0.5, x: 1989, y: 2022 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 75, p: 1, x: 200, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - - expect(manager.context.stackIndex).toEqual(1) - expect(manager.context.stack).toHaveLength(2) - - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - }) - - test("should shift the first element of the stack when maxStackSize is exceeded", () => - { - const NB_STROKE = 10 - for (let i = 0; i < NB_STROKE; i++) { - const p1: TPointer = { t: i * 42, p: 0.5, x: i / 2, y: i * 20 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: i * 10, p: 1, x: i * 10, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - } - - manager.addModelToStack(model) - expect(manager.context.stackIndex + 1).toStrictEqual(configuration.maxStackSize) - - expect(manager.context.stack).toHaveLength(configuration.maxStackSize) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - }) - - describe("undo", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should get the previous model", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const previousModel = manager.undo() - expect(manager.context.stackIndex).toStrictEqual(0) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(previousModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(previousModel) - - expect(manager.context.canUndo).toStrictEqual(false) - expect(manager.context.canRedo).toStrictEqual(true) - }) - }) - - describe("redo", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should get the next model", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - manager.undo() - const lastModel = manager.redo() - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(lastModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(lastModel) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - }) - - describe("updateModelInStack", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should update last model in stack", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - - model.exports = { "text/plain": "-" } - manager.updateModelInStack(model) - - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - }) - - test("should update previous model in stack", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const firstModel = model.getClone() - firstModel.exports = { "text/plain": "-" } - - const p3: TPointer = { t: 100, p: 0.5, x: 1, y: 10 } - model.initCurrentStroke(p3, 666, "pen", DefaultPenStyle) - - const p4: TPointer = { t: 150, p: 0.5, x: 1, y: 10 } - model.endCurrentStroke(p4) - manager.addModelToStack(model) - - manager.updateModelInStack(firstModel) - - expect(manager.context.stack[2]).toMatchObject(firstModel) - expect(manager.context.stack[2]).not.toBe(firstModel) - }) - }) - - test("should reset context", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const newModel = new Model(width, height) - manager.reset(newModel) - - expect(manager.context.stackIndex).toStrictEqual(0) - - expect(manager.context.stack).toHaveLength(1) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(newModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(newModel) - - expect(manager.context.canUndo).toStrictEqual(false) - expect(manager.context.canRedo).toStrictEqual(false) - }) - -}) diff --git a/test/unit/07-behaviors/00-RestBehaviors.test.ts b/test/unit/07-behaviors/00-RestBehaviors.test.ts deleted file mode 100644 index fdf2bbfd..00000000 --- a/test/unit/07-behaviors/00-RestBehaviors.test.ts +++ /dev/null @@ -1,208 +0,0 @@ - -import { delay } from "../utils/helpers" -import { TBehaviorOptions, TConfiguration, IModel, TPointer } from "../../../src/@types" -import { RestBehaviors, DefaultConfiguration, Model, DefaultPenStyle } from "../../../src/iink" - -describe("RestBehaviors.ts", () => -{ - const height = 100, width = 100 - const DefaultBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration - } - - test("should instanciate RestBehaviors", () => - { - const rb = new RestBehaviors(DefaultBehaviorsOptions) - expect(rb).toBeDefined() - }) - - test("should init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - rb.grabber.attach = jest.fn() - rb.renderer.init = jest.fn() - await rb.init(wrapperHTML) - expect(rb.grabber.attach).toBeCalledTimes(1) - expect(rb.grabber.attach).toBeCalledWith(wrapperHTML) - expect(rb.renderer.init).toBeCalledTimes(1) - expect(rb.renderer.init).toBeCalledWith(wrapperHTML) - }) - - test("should call renderer on drawCurrentStroke", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawPendingStroke = jest.fn() - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - rb.drawCurrentStroke() - expect(rb.renderer.drawPendingStroke).toBeCalledTimes(1) - expect(rb.renderer.drawPendingStroke).toBeCalledWith(rb.model.currentStroke) - }) - - describe("updateModelRendering", () => - { - test("should call renderer.drawModel", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.updateModelRendering() - expect(rb.renderer.drawModel).toBeCalledTimes(1) - }) - - test("should call recognizer.export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await rb.updateModelRendering() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(1) - }) - - test("should reject if recognizer.export in error", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(() => Promise.reject("pouet")) - expect(rb.updateModelRendering()).rejects.toEqual("pouet") - }) - - test("should not call recognizer.export when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const rb = new RestBehaviors({ configuration }) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await rb.updateModelRendering() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(0) - }) - }) - - test("should export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.export() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(1) - }) - - test("should convert", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.recognizer.convert = jest.fn(m => Promise.resolve(m)) - rb.convert("DIGITAL_EDIT", ["mime-type"]) - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.convert).toBeCalledTimes(1) - }) - - test("should resize", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - rb.renderer.resize = jest.fn() - rb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await rb.init(wrapperHTML) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - await rb.resize(1, 2) - expect(rb.renderer.resize).toBeCalledTimes(1) - expect(rb.recognizer.resize).toBeCalledTimes(1) - }) - - test("should not call recognizer on resize if no strokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.resize = jest.fn() - rb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await rb.resize(1, 2) - expect(rb.renderer.resize).toBeCalledTimes(1) - expect(rb.recognizer.resize).toBeCalledTimes(0) - }) - - test("should undo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - const model1 = new Model() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.renderer.drawModel = jest.fn() - rb.undoRedoManager.undo = jest.fn(() => model1) - await await rb.updateModelRendering() - const undoModel = await rb.undo() - expect(undoModel).toEqual(model1) - }) - - test("should redo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - const model2: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model2.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model2.endCurrentStroke(p2) - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.renderer.drawModel = jest.fn() - rb.undoRedoManager.redo = jest.fn(() => model2) - const redoModel = await rb.redo() - expect(redoModel.creationTime).toEqual(model2.creationTime) - }) - - test("should clear", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - expect(rb.model.rawStrokes.length).toBeGreaterThan(0) - const clearedModel = await rb.clear() - expect(rb.model.rawStrokes).toHaveLength(0) - expect(clearedModel).toBe(rb.model) - }) - - test("should destroy", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.grabber.detach = jest.fn() - rb.renderer.destroy = jest.fn() - rb.undoRedoManager.reset = jest.fn(m => m) - rb.destroy() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.grabber.detach).toBeCalledTimes(1) - expect(rb.renderer.destroy).toBeCalledTimes(1) - }) - -}) diff --git a/test/unit/07-behaviors/01-WSBehaviors.test.ts b/test/unit/07-behaviors/01-WSBehaviors.test.ts deleted file mode 100644 index 5f6b45f1..00000000 --- a/test/unit/07-behaviors/01-WSBehaviors.test.ts +++ /dev/null @@ -1,818 +0,0 @@ -import { delay } from "../utils/helpers" -import -{ - TBehaviorOptions, - TConfiguration, - TExport, - TStroke, - TWebSocketSVGPatchEvent, - TPointer, - TPenStyle, - TTheme, - TUndoRedoContext -} from "../../../src/@types" -import -{ - WSBehaviors, - DefaultConfiguration, - Constants, - InternalEvent, - Model, - DefaultPenStyle -} from "../../../src/iink" - -describe("WSBehaviors.ts", () => -{ - const height = 100, width = 100 - const DefaultBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration - } - - test("should instanciate WSBehaviors", () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - expect(wsb).toBeDefined() - }) - - test("should have internalEvent property", () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - expect(wsb.internalEvent).toBe(InternalEvent.getInstance()) - expect(wsb.internalEvent).toEqual(InternalEvent.getInstance()) - }) - - describe("init", () => - { - test("should init grabber, renderer & recognizer & context", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.init(wrapperHTML) - await expect(wsb.context).toMatchObject({ - canRedo: false, - canUndo: false, - empty: true, - stackIndex: 0, - possibleUndoCount: 0 - }) - await expect(wsb.grabber.attach).toBeCalledTimes(1) - await expect(wsb.grabber.attach).toBeCalledWith(wrapperHTML) - await expect(wsb.renderer.init).toBeCalledTimes(1) - await expect(wsb.renderer.init).toBeCalledWith(wrapperHTML) - await expect(wsb.recognizer.init).toBeCalledTimes(1) - }) - - test("should resolve init when recognizer.init is resolve", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.init).toBeCalledTimes(1) - }) - - test("should reject init when recognizer.init is reject", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.reject("pouet")) - await expect(wsb.init(wrapperHTML)).rejects.toEqual("pouet") - }) - }) - - describe("drawCurrentStroke", () => - { - test("should call renderer.drawPendingStroke", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.drawPendingStroke = jest.fn() - await wsb.init(wrapperHTML) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - wsb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - wsb.drawCurrentStroke() - await expect(wsb.renderer.drawPendingStroke).toBeCalledTimes(1) - await expect(wsb.renderer.drawPendingStroke).toBeCalledWith(wsb.model.currentStroke) - }) - test("should not call renderer.drawPendingStroke if currentStroke is null", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.drawPendingStroke = jest.fn() - await wsb.init(wrapperHTML) - wsb.drawCurrentStroke() - await expect(wsb.renderer.drawPendingStroke).toBeCalledTimes(0) - }) - }) - - describe("updateModelRendering", () => - { - test("should call recognizer.addStrokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(1) - }) - test("should not call recognizer.addStrokes when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(0) - }) - test("should reject if recognizer.addStrokes rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.updateModelRendering()).rejects.toEqual("poney") - }) - }) - - describe("export", () => - { - test("should call recognizer.export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.export() - await expect(wsb.recognizer.export).toBeCalledTimes(1) - }) - test("should reject if recognizer.export rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.export = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.export()).rejects.toEqual("poney") - }) - test("should call recognizer.addStrokes when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(m => Promise.resolve(m)) - wsb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.export() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(1) - await expect(wsb.recognizer.export).toBeCalledTimes(0) - }) - test("should reject if recognizer.addStrokes rejected when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.export()).rejects.toEqual("poney") - }) - }) - - describe("convert", () => - { - test("should call recognizer.convert", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.convert = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.convert() - await expect(wsb.recognizer.convert).toBeCalledTimes(1) - }) - }) - - describe("import", () => - { - test("should call recognizer.import", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.import = jest.fn() - await wsb.init(wrapperHTML) - const mimeType = "text/plain" - const textImport = "winter is comming" - const blob = new Blob([textImport], { type: mimeType }) - await wsb.import(blob, mimeType) - await expect(wsb.recognizer.import).toBeCalledTimes(1) - }) - test("should return model form recognizer when recognizer emit EXPORTED", async () => - { - const exportExpected: TExport = { "test/plain": "cofveve" } - const wrapperHTML: HTMLElement = document.createElement("div") - const model = new Model(width, height) - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.import = jest.fn(() => - { - model.exports = exportExpected - return Promise.resolve(model) - }) - await wsb.init(wrapperHTML) - const mimeType = "text/plain" - const textImport = "winter is comming" - const blob = new Blob([textImport], { type: mimeType }) - const modelReceive = await wsb.import(blob, mimeType) - await await expect(modelReceive.exports).toBe(exportExpected) - }) - }) - - describe("importPointsEvent", () => - { - test("should call recognizer.importPointsEvents", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn() - wsb.recognizer.importPointEvents = jest.fn() - await wsb.init(wrapperHTML) - const tstrokeToImport: TStroke[] = JSON.parse(`[{ - "pointerType": "PEN", - "pointerId": 1, - "x": [128, 125, 122, 119, 118, 117, 116, 117, 119, 123, 127, 135, 139, 141, 144, 144, 143, 142, 141, 142], - "y": [83, 91, 99, 107, 114, 121, 125, 120, 112, 101, 90, 76, 70, 66, 76, 88, 101, 111, 118, 123], - "t": [1516190046205, 1516190046247, 1516190046264, 1516190046280, 1516190046297, 1516190046314, 1516190046330, 1516190046380, 1516190046397, 1516190046413, 1516190046430, 1516190046447, 1516190046463, 1516190046480, 1516190046547, 1516190046563, 1516190046581, 1516190046597, 1516190046614, 1516190046630], - "p": [0.5, 0.7076987214308235, 0.8060672826037246, 0.8060672826037246, 0.785875329883628, 0.785875329883628, 0.7185264889882718, 0.7461846839143089, 0.8024894359144054, 0.6578786777951477, 0.6578786777951477, 0.5984465727129564, 0.7880849230110567, 0.7292125754002905, 0.6768853685004259, 0.6535898384862245, 0.6389126863152722, 0.6829846120277299, 0.785875329883628, 0.7461846839143089] - },{ - "pointerType": "PEN", - "pointerId": 1, - "x": [117, 122, 128, 139, 146], - "y": [105, 105, 106, 107, 106], - "t": [1516190046870, 1516190046930, 1516190046947, 1516190046963, 1516190046980], - "p": [0.5, 0.7763932022500211, 0.7681880209236327, 0.6676543814462531, 0.785875329883628] - }]`) - await wsb.importPointEvents(tstrokeToImport) - expect(wsb.recognizer.importPointEvents).toBeCalledTimes(1) - expect(wsb.recognizer.importPointEvents).toBeCalledWith(tstrokeToImport) - }) - }) - - describe("resize", () => - { - test("should call renderer.resize", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.resize(1, 2) - await expect(wsb.renderer.resize).toBeCalledTimes(1) - }) - test("should reject if renderer.resize rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(() => Promise.reject("pony")) - await wsb.init(wrapperHTML) - await expect(wsb.resize(1, 2)).rejects.toEqual("pony") - }) - test("should call recognizer.resize after resizeTriggerDelay", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.resize(1, 2) - await delay(DefaultConfiguration.triggers.resizeTriggerDelay) - await expect(wsb.recognizer.resize).toBeCalledTimes(1) - }) - }) - - describe("undo", () => - { - test("should call recognizer.undo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canUndo = true - wsb.context.stackIndex = 1 - wsb.context.stack.push(new Model(100, 200)) - await wsb.undo() - await expect(wsb.recognizer.undo).toBeCalledTimes(1) - }) - test("should return previous model", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - expect(wsb.model).toEqual(wsb.context.stack[0]) - wsb.context.canUndo = true - wsb.context.stackIndex = 1 - wsb.context.stack.push(new Model(100, 200)) - await expect(wsb.undo()).resolves.toEqual(wsb.context.stack[0]) - }) - test("should throw error if context.canUndo = false", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await expect(wsb.undo()).rejects.toEqual(new Error("Undo not allowed")) - }) - }) - - describe("redo", () => - { - test("should call recognizer.redo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - wsb.context.stack.push(new Model(100, 200)) - await wsb.redo() - await expect(wsb.recognizer.redo).toBeCalledTimes(1) - }) - test("should return next model", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - const nextModel = new Model(100, 200) - wsb.context.stack.push(nextModel) - await expect(wsb.redo()).resolves.toEqual(wsb.context.stack[1]) - }) - test("should reject if recognizer.redo rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(() => Promise.reject("pony")) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - wsb.context.stack.push(new Model(100, 200)) - wsb.context.stack.push(new Model(42, 12)) - await expect(wsb.redo()).rejects.toEqual("pony") - }) - test("should throw error if context.canRedo = false", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await expect(wsb.redo()).rejects.toEqual(new Error("Redo not allowed")) - }) - }) - - describe("clear", () => - { - test("should call recognizer.clear", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.clear = jest.fn() - await wsb.init(wrapperHTML) - await wsb.clear() - await expect(wsb.recognizer.clear).toBeCalledTimes(1) - }) - }) - - describe("destroy", () => - { - test("should call grabber.detach", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.grabber.detach).toBeCalledTimes(1) - }) - - test("should call renderer.destroy", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.renderer.destroy).toBeCalledTimes(1) - }) - - test("should call recognizer.destroy", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.recognizer.close).toBeCalledTimes(1) - await expect(wsb.recognizer.close).toBeCalledWith(1000, Constants.WSMessage.CLOSE_RECOGNIZER) - }) - - }) - - describe("Event", () => - { - test("should updatesLayer when recognizer emit SVG_PATCH", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.updatesLayer = jest.fn() - await wsb.init(wrapperHTML) - const svgPatch: TWebSocketSVGPatchEvent = { - type: "REPLACE_ALL", - layer: "MODEL", - updates: [] - } - wsb.recognizer.internalEvent.emitSVGPatch(svgPatch) - await expect(wsb.renderer.updatesLayer).toBeCalledTimes(1) - await expect(wsb.renderer.updatesLayer).toBeCalledWith(svgPatch.layer, svgPatch.updates) - }) - test("should update context when recognizer emit CONTEXT_CHANGE", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.updatesLayer = jest.fn() - await wsb.init(wrapperHTML) - const context: TUndoRedoContext = { - canRedo: true, - canUndo: true, - empty: false, - possibleUndoCount: 10, - stack: [], - stackIndex: 42 - } - wsb.recognizer.internalEvent.emitContextChange(context) - await expect(wsb.context.canRedo).toEqual(context.canRedo) - await expect(wsb.context.canUndo).toEqual(context.canUndo) - await expect(wsb.context.empty).toEqual(context.empty) - await expect(wsb.context.possibleUndoCount).toEqual(context.possibleUndoCount) - await expect(wsb.context.stackIndex).toEqual(context.stackIndex) - }) - }) - - describe("Style", () => - { - test("should call styleManager.setPenStyle & recognizer.setPenStyle on init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const customPenStyle: TPenStyle = { color: "#d1d1d1" } - const customBehaviorsOptions: TBehaviorOptions = JSON.parse(JSON.stringify(DefaultBehaviorsOptions)) - customBehaviorsOptions.penStyle = customPenStyle - const wsb = new WSBehaviors(customBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyle = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.styleManager.setPenStyle).toBeCalledTimes(1) - await expect(wsb.styleManager.setPenStyle).toBeCalledWith(customPenStyle) - await expect(wsb.recognizer.setPenStyle).toBeCalledTimes(1) - await expect(wsb.recognizer.setPenStyle).toBeCalledWith(customPenStyle) - }) - test("should change PenStyle", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyle = jest.fn() - await wsb.init(wrapperHTML) - const customPenStyle: TPenStyle = { color: "#d1d1d1" } - await wsb.setPenStyle(customPenStyle) - await expect(wsb.styleManager.setPenStyle).toBeCalledTimes(2) - await expect(wsb.styleManager.setPenStyle).toHaveBeenNthCalledWith(2, customPenStyle) - await expect(wsb.recognizer.setPenStyle).toBeCalledTimes(2) - await expect(wsb.recognizer.setPenStyle).toHaveBeenNthCalledWith(2, wsb.styleManager.penStyle) - }) - test("should call styleManager.setTheme & recognizer.setTheme on init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const customBehaviorsOptions: TBehaviorOptions = JSON.parse(JSON.stringify(DefaultBehaviorsOptions)) - const customTheme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - customBehaviorsOptions.theme = customTheme - const wsb = new WSBehaviors(customBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.styleManager.setTheme = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(1) - await expect(wsb.styleManager.setTheme).toBeCalledWith(customTheme) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(1) - await expect(wsb.recognizer.setTheme).toBeCalledWith(wsb.styleManager.theme) - }) - test("should change Theme", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.styleManager.setTheme = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(1) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(1) - const customTheme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - await wsb.setTheme(customTheme) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(2) - await expect(wsb.styleManager.setTheme).toHaveBeenNthCalledWith(2, customTheme) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(2) - await expect(wsb.recognizer.setTheme).toHaveBeenNthCalledWith(2, wsb.styleManager.theme) - }) - test("should change PenStyleClasses", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyleClasses = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.setPenStyleClasses).toBeCalledTimes(1) - await expect(wsb.styleManager.setPenStyleClasses).toBeCalledTimes(1) - await wsb.setPenStyleClasses("pouet") - await expect(wsb.styleManager.setPenStyleClasses).toBeCalledTimes(2) - await expect(wsb.styleManager.setPenStyleClasses).toHaveBeenNthCalledWith(2, "pouet") - await expect(wsb.recognizer.setPenStyleClasses).toBeCalledTimes(2) - await expect(wsb.recognizer.setPenStyleClasses).toHaveBeenNthCalledWith(2, wsb.styleManager.penStyleClasses) - }) - }) - -}) diff --git a/test/unit/08-smart-guide/00-SmartGuide.test.ts b/test/unit/08-smart-guide/00-SmartGuide.test.ts deleted file mode 100644 index bc999e1d..00000000 --- a/test/unit/08-smart-guide/00-SmartGuide.test.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { delay } from "../utils/helpers" -import { LeftClickEventFake } from "../utils/PointerEventFake" -import -{ - TRenderingConfiguration, - TMarginConfiguration -} from "../../../src/@types" -import -{ - DefaultRenderingConfiguration, - InternalEvent, - SmartGuide -} from "../../../src/iink" - -describe("SmartGuide.ts", () => -{ - const margin: TMarginConfiguration = { - bottom: 100, - top: 20, - left: 30, - right: 40 - } - test("should instanciate SmartGuide", () => - { - const sm = new SmartGuide() - expect(sm).toBeDefined() - }) - - test("should have internalEvent property", () => - { - const sm = new SmartGuide() - expect(sm.internalEvent).toBe(InternalEvent.getInstance()) - }) - - describe("Initilize", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - test("should init wrapper", () => - { - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide).toBeDefined() - expect(smartguide.id).toBe(`smartguide-${ sm.uuid }`) - }) - test("should init prompter", () => - { - const prompter = domElement.querySelector(".prompter-container") as HTMLDivElement - expect(prompter).toBeDefined() - expect(prompter.id).toBe(`prompter-container-${ sm.uuid }`) - - const prompterText = domElement.querySelector(".prompter-text") as HTMLDivElement - expect(prompterText).toBeDefined() - expect(prompterText.id).toBe(`prompter-text-${ sm.uuid }`) - }) - test("should init ellipsis", () => - { - const wrapper = domElement.querySelector(".ellipsis") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`ellipsis-${ sm.uuid }`) - }) - test("should init ellipsis", () => - { - const wrapper = domElement.querySelector(".tag-icon") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`tag-icon-${ sm.uuid }`) - }) - test("should init candidates", () => - { - const wrapper = domElement.querySelector(".candidates") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`candidates-${ sm.uuid }`) - }) - test("should init more-menu", () => - { - const wrapper = domElement.querySelector(".more-menu") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`more-menu-${ sm.uuid }`) - - const copyBtn = domElement.querySelector(`#copy-${ sm.uuid }`) as HTMLDivElement - expect(copyBtn).toBeDefined() - expect(copyBtn.classList).toContain("options-label-button") - - const deleteBtn = domElement.querySelector(`#delete-${ sm.uuid }`) as HTMLDivElement - expect(deleteBtn).toBeDefined() - expect(deleteBtn.classList).toContain("options-label-button") - }) - }) - - describe("Smartguide visibility", () => - { - test("should be displayed on initialization", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide.classList).not.toContain("smartguide-out") - expect(smartguide.classList).toContain("smartguide-in") - }) - test("should be hide after fadeOut delay", async () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - const renderingConfiguration: TRenderingConfiguration = { - ...DefaultRenderingConfiguration - } - renderingConfiguration.smartGuide.fadeOut.enable = true - renderingConfiguration.smartGuide.fadeOut.duration = 100 - sm.init(domElement, margin, renderingConfiguration) - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide.classList).not.toContain("smartguide-out") - expect(smartguide.classList).toContain("smartguide-in") - - await delay(renderingConfiguration.smartGuide.fadeOut.duration + 10) - expect(smartguide.classList).toContain("smartguide-out") - expect(smartguide.classList).not.toContain("smartguide-in") - }) - }) - - describe("Menu visibility", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - test("should hidden by default", () => - { - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).toContain("close") - expect(menu.classList).not.toContain("open") - }) - test("should open menu", () => - { - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).not.toContain("close") - expect(menu.classList).toContain("open") - }) - test("should close menu", () => - { - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).toContain("close") - expect(menu.classList).not.toContain("open") - }) - }) - - describe("Menu actions", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.internalEvent.emitConvert = jest.fn() - sm.internalEvent.emitClear = jest.fn() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - test("should emit CONVERT", () => - { - const btn = domElement.querySelector(`#convert-${ sm.uuid }`) as HTMLDivElement - btn.dispatchEvent(pointerDownEvt) - expect(sm.internalEvent.emitConvert).toBeCalledTimes(1) - }) - test.skip("should COPY", () => - { - // TODO - }) - test("should emit CLEAR", () => - { - const btn = domElement.querySelector(`#delete-${ sm.uuid }`) as HTMLDivElement - btn.dispatchEvent(pointerDownEvt) - expect(sm.internalEvent.emitClear).toBeCalledTimes(1) - }) - }) - - describe("Display", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - const jiix = { - "type": "Text", - "label": "hello how", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": ["hello", "helle", "hellor", "hells", "hellon"] - }, - { - "label": " " - }, - { - "id": "2", - "label": "how", - "candidates": ["how", "hou", "hore", "hon", "hor"] - } - ], - "version": "3", - "id": "MainBlock" - } - - test("should display jiix label into prompter-text", () => - { - sm.update(jiix) - const prompterText = domElement.querySelector(".prompter-text") as HTMLDivElement - expect(prompterText).toBeDefined() - expect(prompterText.textContent).toContain(jiix.words[0].label) - expect(prompterText.textContent).toContain(jiix.words[2].label) - expect(prompterText.children.length).toBeGreaterThan(0) - const candidates = domElement.querySelector(".candidates") as HTMLDivElement - expect(candidates.children).toHaveLength(0) - }) - - test.skip("should open candidates", () => - { - // cannot be tested here, you have to simulate an event with a target different from the prompter - const prompterTextElement = domElement.querySelector(".prompter-text") as HTMLDivElement - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1, - }) - - prompterTextElement.dispatchEvent(pointerDownEvt) - const candidates = domElement.querySelector(".candidates") as HTMLDivElement - expect(candidates.children).toHaveLength(jiix.words.length) - }) - }) - -}) diff --git a/test/unit/09-event/00-PublicEvent.test.ts b/test/unit/09-event/00-PublicEvent.test.ts deleted file mode 100644 index f82b6e4c..00000000 --- a/test/unit/09-event/00-PublicEvent.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { - TExport, - TJIIXExport -} from '../../../src/@types' -import { - Constants, - PublicEvent, - Model -} from '../../../src/iink' - -describe('PublicEvent.ts', () => -{ - const publicEvent = PublicEvent.getInstance() - - test('should have singleton', () => - { - const publicEvent1 = PublicEvent.getInstance() - const publicEvent2 = PublicEvent.getInstance() - expect(publicEvent1).toBe(publicEvent2) - expect(publicEvent1).toEqual(publicEvent2) - expect(publicEvent1).toStrictEqual(publicEvent2) - }) - - test('should emit & listen LOADED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.LOADED, testFunction) - publicEvent.emitLoaded() - expect(testFunction).toBeCalledTimes(1) - }) - - test('should emit & listen EXPORTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.EXPORTED, testFunction) - const exports:TExport = { 'text/plain': 'tatapouet' } - publicEvent.emitExported(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - - test('should emit & listen CHANGED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.CHANGED, testFunction) - const undoRedoContext = { - canUndo: true, - canRedo: false, - canClear: true, - stackIndex: 10, - empty: false, - possibleUndoCount: 10, - stack: [] - } - publicEvent.emitChanged(undoRedoContext) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: undoRedoContext - }), - ) - }) - - test('should emit & listen IDLE', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.IDLE, testFunction) - publicEvent.emitIdle(true) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: true - }), - ) - }) - - test('should emit & listen CLEARED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.CLEARED, testFunction) - const model = new Model(100, 50) - publicEvent.emitCleared(model) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: model - }), - ) - }) - - test('should emit & listen CONVERTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.CONVERTED, testFunction) - const exports: TExport = { 'text/plain': 'tatapouet' } - publicEvent.emitConverted(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - - test('should emit & listen IMPORTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.IMPORTED, testFunction) - const jiix: TJIIXExport = { - "type": "Text", - "label": "hello", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": [ "hello", "helle", "hellor", "hells", "hellon" ] - } - ], - "version": "3", - "id": "MainBlock" - } - const exports: TExport = { - "application/vnd.myscript.jiix": jiix - } - publicEvent.emitImported(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - -}) diff --git a/test/unit/09-event/01-InternalEvent.test.ts b/test/unit/09-event/01-InternalEvent.test.ts deleted file mode 100644 index af0eace7..00000000 --- a/test/unit/09-event/01-InternalEvent.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { TWebSocketSVGPatchEvent } from "../../../src/@types" -import { InternalEvent } from "../../../src/iink" - -describe("InternalEvent.ts", () => -{ - const internalEvent = InternalEvent.getInstance() - - test("should have singleton", () => - { - const iEvent1 = InternalEvent.getInstance() - const iEvent2 = InternalEvent.getInstance() - expect(iEvent1).toBe(iEvent2) - expect(iEvent1).toEqual(iEvent2) - expect(iEvent1).toStrictEqual(iEvent2) - }) - - test("should execute callback on emitSVGPatch", () => - { - const testFunction = jest.fn() - internalEvent.addSVGPatchListener(testFunction) - const svgPatch: TWebSocketSVGPatchEvent = { - type: "svgPatch", - layer: "MODEL", - updates: [] - } - internalEvent.emitSVGPatch(svgPatch) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(svgPatch) - }) - - test("should execute callback on emitNotif", () => - { - const testFunction = jest.fn() - internalEvent.addNotifListener(testFunction) - const notif = { message: "this is the end", timeout: 666 } - internalEvent.emitNotif(notif) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(notif) - }) - - test("should execute callback on emitError", () => - { - const testFunction = jest.fn() - internalEvent.addErrorListener(testFunction) - const error = new Error("this is un error message") - internalEvent.emitError(error) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(error) - }) - - test("should execute callback on emitClear", () => - { - const testFunction = jest.fn() - internalEvent.addClearListener(testFunction) - internalEvent.emitClear() - expect(testFunction).toBeCalledTimes(1) - }) - - test("should execute callback on emitConvert", () => - { - const testFunction = jest.fn() - internalEvent.addConvertListener(testFunction) - internalEvent.emitConvert("DIGITAL_EDIT") - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith("DIGITAL_EDIT") - }) - - test("should execute callback on emitImportJIIX", () => - { - const testFunction = jest.fn() - internalEvent.addImportJIIXListener(testFunction) - const jiix = { - "type": "Text", - "label": "hello", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": [ "hello", "helle", "hellor", "hells", "hellon" ] - } - ], - "version": "3", - "id": "MainBlock" - } - internalEvent.emitImportJIIX(jiix) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(jiix) - }) - - test("should execute callback on emitClearMessage", () => - { - const testFunction = jest.fn() - internalEvent.addClearMessageListener(testFunction) - internalEvent.emitClearMessage() - expect(testFunction).toBeCalledTimes(1) - }) -}) diff --git a/test/unit/99-iink/00-Editor.test.ts b/test/unit/99-iink/00-Editor.test.ts deleted file mode 100644 index 45cee3d6..00000000 --- a/test/unit/99-iink/00-Editor.test.ts +++ /dev/null @@ -1,698 +0,0 @@ -import { AllOverrideConfiguration } from "../_dataset/configuration.dataset" -import { delay } from "../utils/helpers" -// import { LeftClickEventFake } from "../utils/PointerEventFake" -import -{ - TBehaviorOptions, - TStroke, - TTheme, - TPenStyle, - TJIIXExport, - TConfiguration -} from "../../../src/@types" -import -{ - Editor, - DefaultConfiguration, - DefaultPenStyle, - DefaultTheme, - Model, - PointerEventGrabber, - WSRecognizer, - PublicEvent, - Constants, - ModeInteraction, - InternalEvent -} from "../../../src/iink" - -describe("Editor.ts", () => -{ - const publicEvent = PublicEvent.getInstance() - const DefaultBehaviorsOptions: TBehaviorOptions = { configuration: DefaultConfiguration } - - describe("constructor", () => - { - test("should instantiate Editor", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor).toBeDefined() - expect(editor.configuration).toBeDefined() - expect(editor.model).toBeDefined() - }) - test("should instantiate Editor with custom configuration", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, { configuration: (AllOverrideConfiguration as TConfiguration) }) - editor.initialize() - expect(editor).toBeDefined() - expect(editor.configuration).toBeDefined() - expect(editor.model).toBeDefined() - }) - test("should define default grabber", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.grabber).not.toBe(customGrabber) - }) - test("should override grabber", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - const customBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration, - behaviors: { - grabber: customGrabber - } - } - const editor = new Editor(wrapperHTML, customBehaviorsOptions) - expect(editor.grabber).toBe(customGrabber) - }) - test("should define default recognizer", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customRecognizer = new WSRecognizer(DefaultConfiguration.server, DefaultConfiguration.recognition) - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.behaviors.recognizer).not.toBe(customRecognizer) - }) - test("should override recognizer", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customRecognizer = new WSRecognizer(DefaultConfiguration.server, DefaultConfiguration.recognition) - const customBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration, - behaviors: { - recognizer: customRecognizer - } - } - const editor = new Editor(wrapperHTML, customBehaviorsOptions) - expect(editor.behaviors.recognizer).toBe(customRecognizer) - }) - test("should throw error if instantiate Editor without configuration", () => - { - expect.assertions(1) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - try { - //@ts-ignore - new Editor(wrapperHTML, {}) - } - catch (error) { - expect((error as Error).message).toEqual("Configuration required") - } - }) - test("should append loader element", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(wrapperHTML.querySelector(".loader")).toBeDefined() - }) - test("should append error element", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(wrapperHTML.querySelector(".error-msg")).toBeDefined() - }) - }) - - describe("initialize", () => - { - test("should display and hide loader", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - const LOAD_TIMEOUT = 200 - editor.behaviors.init = jest.fn(async () => { await delay(LOAD_TIMEOUT); return Promise.resolve() }) - const loaderElement = wrapperHTML.getElementsByClassName("loader") - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("none") - editor.initialize() - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("initial") - await delay(LOAD_TIMEOUT) - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("none") - }) - test("should resolve when behaviors.init is resolved", async () => - { - expect.assertions(1) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - expect(editor.initializationPromise).toBeDefined() - }) - test("should reject when behaviors.init is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.reject("pouet")) - expect(editor.initialize()).rejects.toEqual("pouet") - }) - test("should show error when behaviors.init is rejected", async () => - { - expect.assertions(3) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.reject(new Error("pouet"))) - const messageElement = wrapperHTML.getElementsByClassName("message") - try { - //@ts-ignore - expect(messageElement.item(0)?.style.display).toEqual("none") - await editor.initialize() - } catch (error) { - //@ts-ignore - expect(messageElement.item(0)?.style.display).toEqual("initial") - //@ts-ignore - expect(messageElement.item(0)?.innerText).toEqual("pouet") - } - }) - }) - - describe("configuration", () => - { - test("should change behaviors", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.behaviors.name).toEqual("WSBehaviors") - editor.behaviors.destroy = jest.fn(() => Promise.resolve()) - //@ts-ignore - editor.configuration = { ...DefaultBehaviorsOptions, server: { protocol: "REST" } } - expect(editor.behaviors.name).toEqual("RestBehaviors") - }) - }) - - describe("mode", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - test("should init mode = Writing", () => - { - expect(editor.mode).toBe(ModeInteraction.Writing) - }) - test("should set mode = erase", () => - { - editor.mode = ModeInteraction.Erasing - expect(wrapperHTML.classList).toContain("erasing") - }) - test("should toggle mode", () => - { - editor.mode = ModeInteraction.Erasing - expect(wrapperHTML.classList).toContain("erasing") - editor.mode = ModeInteraction.Writing - expect(wrapperHTML.classList).not.toContain("erasing") - }) - }) - - describe("context", () => - { - test("should get context", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.context).toBe(editor.behaviors.context) - }) - }) - - describe('undo', () => - { - test("should resolve when behaviors.undo is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.undo = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.undo() - expect(editor.behaviors.undo).toBeCalledTimes(1) - }) - test("should reject when behaviors.undo is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.undo = jest.fn(() => Promise.reject("pouet")) - expect(editor.undo()).rejects.toEqual("pouet") - }) - }) - - describe("redo", () => - { - test("should resolve when behaviors.redo is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.redo = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.redo() - expect(editor.behaviors.redo).toBeCalledTimes(1) - }) - test("should reject when behaviors.redo is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.redo = jest.fn(() => Promise.reject("pouet")) - expect(editor.redo()).rejects.toEqual("pouet") - }) - }) - - describe("clear", () => - { - test("should resolve when behaviors.clear is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.clear = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.clear() - expect(editor.behaviors.clear).toBeCalledTimes(1) - }) - test("should reject when behaviors.clear is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.clear = jest.fn(() => Promise.reject("pouet")) - expect(editor.clear()).rejects.toEqual("pouet") - }) - test("should emit cleared event", async () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(Constants.EventType.CLEARED, testFunction) - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - const modelExpected = new Model(100, 100) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.clear = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.clear() - expect(testFunction).toBeCalledTimes(1) - }) - }) - - describe("resize", () => - { - test("should resolve when behaviors.resize is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.resize = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.resize() - expect(editor.behaviors.resize).toBeCalledTimes(1) - }) - test("should reject when behaviors.resize is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.resize = jest.fn(() => Promise.reject("pouet")) - expect(editor.resize()).rejects.toEqual("pouet") - }) - }) - - describe("export", () => - { - test("should resolve when behaviors.export is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.export = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.export() - expect(editor.behaviors.export).toBeCalledTimes(1) - }) - test("should reject when behaviors.export is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.export = jest.fn(() => Promise.reject("pouet")) - expect(editor.export()).rejects.toEqual("pouet") - }) - }) - - describe("convert", () => - { - test("should resolve when behaviors.convert is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.convert = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.convert() - expect(editor.behaviors.convert).toBeCalledTimes(1) - }) - test("should reject when behaviors.convert is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.convert = jest.fn(() => Promise.reject("pouet")) - expect(editor.convert()).rejects.toEqual("pouet") - }) - }) - - describe("import", () => - { - test("should resolve import Blob when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - await editor.import(new Blob(), "text/plain") - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import Blob if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - expect(editor.import(new Blob(), "text/plain")).rejects.toEqual("pouet") - }) - test("should reject import Blob if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - expect(editor.import(new Blob(), "text/plain")).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import Text when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - await editor.import("hello", "text/plain") - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import Text if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - expect(editor.import("hello", "text/plain")).rejects.toEqual("pouet") - }) - test("should reject import Text if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - expect(editor.import("hello", "text/plain")).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import JIIX when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - await editor.import(jiix) - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import JIIX if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - expect(editor.import(jiix)).rejects.toEqual("pouet") - }) - test("should reject import JIIX if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - expect(editor.import(jiix)).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import points Events when behaviors.importPointEvents is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = jest.fn(() => Promise.resolve(model)) - await editor.importPointEvents(tstrokeToImport) - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.importPointEvents).toBeCalledTimes(1) - }) - test("should resolve import points Events when behaviors.importPointEvents is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = jest.fn(() => Promise.reject("pouet")) - expect(editor.importPointEvents(tstrokeToImport)).rejects.toEqual("pouet") - }) - test("should reject import Points if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = undefined - expect(editor.importPointEvents(tstrokeToImport)).rejects.toEqual("Import impossible, behaviors has no importPointEvents function") - }) - }) - - describe("Style", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - let editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - test("should init theme", () => - { - expect(editor.theme).toStrictEqual(DefaultTheme) - }) - test("should set theme", () => - { - editor.behaviors.setTheme = jest.fn() - //@ts-ignore - const customTheme: TTheme = { - ink: { - width: 42, - color: "red", - "-myscript-pen-fill-color": "blue", - "-myscript-pen-fill-style": "style", - "-myscript-pen-width": 5 - } - } - editor.theme = customTheme - expect(editor.behaviors.setTheme).toBeCalledTimes(1) - expect(editor.behaviors.setTheme).toBeCalledWith(customTheme) - }) - test("should set penStyleClasses", () => - { - editor.behaviors.setPenStyleClasses = jest.fn() - const customPenStyleClasses = "customPenStyleClasses" - editor.penStyleClasses = customPenStyleClasses - expect(editor.behaviors.setPenStyleClasses).toBeCalledTimes(1) - expect(editor.behaviors.setPenStyleClasses).toBeCalledWith(customPenStyleClasses) - }) - test("should init penStyle", () => - { - expect(editor.penStyle).toStrictEqual(DefaultPenStyle) - }) - test("should init penStyle", () => - { - editor.behaviors.setPenStyle = jest.fn() - const customPenStyle: TPenStyle = { - width: 42, - color: "red", - "-myscript-pen-fill-color": "blue", - "-myscript-pen-fill-style": "style", - "-myscript-pen-width": 5 - } - editor.penStyle = customPenStyle - expect(editor.behaviors.setPenStyle).toBeCalledTimes(1) - expect(editor.behaviors.setPenStyle).toBeCalledWith(customPenStyle) - }) - }) - - describe("Events", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - // TODO problem with internal event singleton - test.skip("should call clear when internalEvent emit clear", () => - { - editor.clear = jest.fn() - expect(editor.clear).toBeCalledTimes(0) - InternalEvent.getInstance().emitClear() - expect(editor.clear).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should call convert when internalEvent emit convert", () => - { - editor.convert = jest.fn() - expect(editor.convert).toBeCalledTimes(0) - InternalEvent.getInstance().emitConvert() - expect(editor.convert).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should emit changed when internalEvent emit changed", () => - { - editor.events.emitChanged = jest.fn() - expect(editor.events.emitChanged).toBeCalledTimes(0) - InternalEvent.getInstance().emitContextChange({ canRedo: true, canUndo: true, empty: false, possibleUndoCount: 10, stack: [], stackIndex: 11 }) - expect(editor.events.emitChanged).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should emit idle when internalEvent emit idle", () => - { - editor.events.emitIdle = jest.fn() - expect(editor.events.emitIdle).toBeCalledTimes(0) - InternalEvent.getInstance().emitIdle(true) - expect(editor.events.emitIdle).toBeCalledTimes(1) - }) - }) - -}) diff --git a/test/unit/99-iink/01-utils.test.ts b/test/unit/99-iink/01-utils.test.ts deleted file mode 100644 index b83d2993..00000000 --- a/test/unit/99-iink/01-utils.test.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { ConfigurationTextWebsocket } from "../_dataset/configuration.dataset" -import -{ - getAvailableLanguageList, - getAvailableFontList, - version, - geometric -} from "../../../src/iink" - -describe("utils", () => -{ - describe("getAvailableLanguageList", () => - { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => Promise.resolve({ fr: "fr_FR" }), - }), - ) as jest.Mock - - test("should call fetch with good url", async () => - { - await getAvailableLanguageList(ConfigurationTextWebsocket) - expect(fetch).toBeCalledTimes(1) - expect(fetch).toBeCalledWith(`${ ConfigurationTextWebsocket?.server?.scheme }://${ ConfigurationTextWebsocket?.server?.host }/api/v4.0/iink/availableLanguageList`) - }) - - test("should reject getAvailableLanguageList if no configuration", async () => - { - // @ts-ignore - getAvailableLanguageList() - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server.scheme is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.scheme - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.host - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - }) - - describe("getAvailableFontList", () => - { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => Promise.resolve({ result: [] }), - }), - ) as jest.Mock - - test("should call fetch with good url", async () => - { - await getAvailableFontList(ConfigurationTextWebsocket) - expect(fetch).toBeCalledTimes(1) - expect(fetch).toBeCalledWith(`${ ConfigurationTextWebsocket?.server?.scheme }://${ ConfigurationTextWebsocket?.server?.host }/api/v4.0/iink/font/google/language/${ ConfigurationTextWebsocket?.recognition?.lang }`) - }) - - test("should reject getAvailableFontList if no configuration", async () => - { - // @ts-ignore - getAvailableFontList() - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.scheme is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.scheme - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.host - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.recognition?.lang - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.recognition.lang is required!") - }) - }) - }) - - describe("version", () => - { - const testDatas = [ - { source: "1.0.1", target: "1.0.0", expected: true }, - { source: "1.1.0", target: "1.0.0", expected: true }, - { source: "2.0.0", target: "1.0.0", expected: true }, - { source: "2.0.0", target: "1.9.14", expected: true }, - { source: "2.12.90", target: "2.12.88", expected: true }, - { source: "1.99.99", target: "2.0.0", expected: false }, - { source: "2.0.9", target: "2.0.91", expected: false }, - { source: "2.11.9", target: "2.12.88", expected: false }, - { source: "1.0.0", target: "1.0.0", expected: true }, - ] - - testDatas.forEach(d => - { - test(`shoud get ${ d.source } is ${ d.expected ? "higher" : "lower" } than ${ d.target }`, () => - { - expect(version.isVersionSuperiorOrEqual(d.source, d.target)).toEqual(d.expected) - }) - }) - }) - - describe("geometric", () => - { - describe("computeDistance", () => - { - const testDatas = [ - { - p1: { x: 0, y: 0 }, - p2: { x: 0, y: 3 }, - expected: 3 - }, - { - p1: { x: 0, y: 0 }, - p2: { x: 3, y: 0 }, - expected: 3 - }, - { - p1: { x: 0, y: 0 }, - p2: { x: 1, y: 1 }, - expected: Math.sqrt(2) - }, - ] - testDatas.forEach(d => - { - test(`should computed distance of P1: [${ JSON.stringify(d.p1) }] & P2: [${ JSON.stringify(d.p2) }] to equal ${ d.expected }`, () => - { - expect(geometric.computeDistance(d.p1, d.p2)).toEqual(d.expected) - }) - }) - }) - }) -}) diff --git a/test/unit/99-iink/02-Iink.test.ts b/test/unit/99-iink/02-Iink.test.ts deleted file mode 100644 index ac7bf3e5..00000000 --- a/test/unit/99-iink/02-Iink.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - Editor, - getAvailableLanguageList, - getAvailableFontList, - DefaultConfiguration, - DefaultEventsConfiguration, - DefaultGrabberConfiguration, - DefaultRecognitionConfiguration, - DefaultRenderingConfiguration, - DefaultServerConfiguration, - DefaultTriggerConfiguration, - DefaultUndoRedoConfiguration, - RestBehaviors, - WSBehaviors, - DefaultPenStyle, - DefaultTheme, -} from '../../../src/iink' - -describe('Iink.ts', () => -{ - test('should export getAvailableLanguageList', async () => - { - expect(getAvailableLanguageList).toBeDefined() - }) - test('should export getAvailableFontList', async () => - { - expect(getAvailableFontList).toBeDefined() - }) - test('should export Editor', async () => - { - expect(Editor).toBeDefined() - }) - test('should export DefaultConfiguration', async () => - { - expect(DefaultConfiguration).toBeDefined() - }) - test('should export DefaultEventsConfiguration', async () => - { - expect(DefaultEventsConfiguration).toBeDefined() - }) - test('should export DefaultGrabberConfiguration', async () => - { - expect(DefaultGrabberConfiguration).toBeDefined() - }) - test('should export DefaultRecognitionConfiguration', async () => - { - expect(DefaultRecognitionConfiguration).toBeDefined() - }) - test('should export DefaultRenderingConfiguration', async () => - { - expect(DefaultRenderingConfiguration).toBeDefined() - }) - test('should export DefaultServerConfiguration', async () => - { - expect(DefaultServerConfiguration).toBeDefined() - }) - test('should export DefaultTriggerConfiguration', async () => - { - expect(DefaultTriggerConfiguration).toBeDefined() - }) - test('should export DefaultUndoRedoConfiguration', async () => - { - expect(DefaultUndoRedoConfiguration).toBeDefined() - }) - test('should export RestBehaviors', async () => - { - expect(RestBehaviors).toBeDefined() - }) - test('should export WSBehaviors', async () => - { - expect(WSBehaviors).toBeDefined() - }) - test('should export DefaultPenStyle', async () => - { - expect(DefaultPenStyle).toBeDefined() - }) - test('should export DefaultTheme', async () => - { - expect(DefaultTheme).toBeDefined() - }) - - -}) diff --git a/test/unit/_dataset/configuration.dataset.ts b/test/unit/_dataset/configuration.dataset.ts deleted file mode 100644 index 8119b076..00000000 --- a/test/unit/_dataset/configuration.dataset.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { TConfigurationClient } from "../../../src/@types/Configuration" - -export const ConfigurationTextWebsocket: TConfigurationClient = { - server: { - protocol: 'WEBSOCKET', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - lang: "en_US", - type: 'TEXT', - text: { - mimeTypes: ['text/plain', 'application/vnd.myscript.jiix'], - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - } - } -} - -export const ConfigurationTextRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'TEXT', - text: { - mimeTypes: ['text/plain', 'application/vnd.myscript.jiix'], - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - } - } -} - -export const ConfigurationDiagramRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'DIAGRAM', - diagram: { - mimeTypes: ['application/vnd.myscript.jiix'] - } - } -} - -export const ConfigurationRawContentRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'Raw Content', - } -} - -export const AllOverrideConfiguration: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'host', - applicationKey: 'applicationKey', - hmacKey: 'hmacKey', - version: '2.0.4', - useWindowLocation: false, - websocket: { - pingEnabled: false, - pingDelay: 42, - maxPingLostCount: 42, - autoReconnect: false, - maxRetryCount: 42, - fileChunkSize: 42 - } - }, - recognition: { - type: 'DIAGRAM', - alwaysConnected: false, - lang: 'fr_FR', - gesture: { - enable: false - }, - export: { - 'image-resolution': 12, - jiix: { - 'bounding-box': true, - strokes: true, - text: { - chars: true, - words: false - } - }, - }, - renderer: { - debug: { - 'draw-text-boxes': true, - 'draw-image-boxes': true - } - }, - math: { - mimeTypes: ['application/mathml+xml'], // 'application/mathml+xml', 'application/vnd.myscript.jiix', - solver: { - enable: false, - 'fractional-part-digits': 4, - 'decimal-separator': ',', - 'rounding-mode': 'truncate', - 'angle-unit': 'rad' - }, - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - eraser: { - 'erase-precisely': true - }, - 'undo-redo': { - mode: 'session' - } - }, - text: { - guides: { - enable: false - }, - mimeTypes: ['application/vnd.myscript.jiix'], - margin: { - top: 21, - left: 21, - right: 21, - bottom: 21 - }, - eraser: { - 'erase-precisely': true - } - }, - diagram: { - mimeTypes: ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], - eraser: { - 'erase-precisely': true - }, - convert: { - "match-text-size": true, - }, - }, - 'raw-content': { - recognition: { - text: false, - shape: true - }, - eraser: { - 'erase-precisely': true - } - } - }, - grabber: { - listenerOptions: { - capture: true, - passive: false - }, - xyFloatPrecision: 27, - timestampFloatPrecision: 27 - }, - rendering: { - minHeight: 42, - minWidth: 42, - smartGuide: { - enable: false, - fadeOut: { - enable: true, - duration: 42 - } - }, - guides: { - enable: false, - gap: 100 - } - }, - triggers: { - exportContent: 'DEMAND', - exportContentDelay: 5, - resizeTriggerDelay: 5 - }, - events: { - processDelay: 0 - }, - 'undo-redo': { - maxStackSize: 10 - } -} diff --git a/test/unit/jest.setup.js b/test/unit/jest.setup.js deleted file mode 100644 index 96bbedaf..00000000 --- a/test/unit/jest.setup.js +++ /dev/null @@ -1 +0,0 @@ -global.structuredClone = (val) => JSON.parse(JSON.stringify(val)) \ No newline at end of file diff --git a/test/unit/utils/PointerEventFake.ts b/test/unit/utils/PointerEventFake.ts deleted file mode 100644 index 4aea108a..00000000 --- a/test/unit/utils/PointerEventFake.ts +++ /dev/null @@ -1,84 +0,0 @@ -type EventFakeProps = { - clientX: number - clientY: number - pressure: number - pointerType: string -} - -type CompleteEventFakeProps = EventFakeProps & { - button: number - buttons: number -} - -type TouchListFake = ({clientX: number, clientY: number})[] - -export class PointerEventFake extends Event { - clientX: number - clientY: number - pressure: number - pointerType: string - button: number - buttons: number - pointerId: number - constructor(type: string, props: CompleteEventFakeProps) { - super(type, props as EventInit); - this.clientX = props.clientX - this.clientY = props.clientY - this.pointerType = props.pointerType - this.pressure = props.pressure - this.button = props.button - this.buttons = props.buttons - this.pointerId = Math.floor(Math.random() * 100) - } -} - -export class LeftClickEventFake extends PointerEventFake { - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 1 - }) - } -} - -export class RightClickEventFake extends PointerEventFake { - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 1, - buttons: 1 - }) - } -} - - -export class TouchEventFake extends PointerEventFake { - changedTouches: TouchListFake - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 1 - }) - this.changedTouches = [{ - clientX: props.clientX, - clientY: props.clientY, - }] - } -} - -export class DoubleTouchEventFake extends PointerEventFake { - changedTouches: TouchListFake - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 2 - }) - this.changedTouches = [{ - clientX: props.clientX, - clientY: props.clientY, - }] - } -} \ No newline at end of file diff --git a/test/unit/utils/helpers.ts b/test/unit/utils/helpers.ts deleted file mode 100644 index 3097053e..00000000 --- a/test/unit/utils/helpers.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export const delay = (delayInms: number) => { - return new Promise(resolve => setTimeout(resolve, delayInms)); -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 86b38b11..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "compilerOptions": { - "outDir": "dist", - "target": "ES2015", - "module": "ES2015", - "moduleResolution": "node", - "lib": [ - "DOM", - "ES2015", - "ES2016", - "ES2017" - ], - "declaration": false, - "declarationMap": false, - "removeComments": false, - "preserveConstEnums": true, - "sourceMap": true, - "strict": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "allowSyntheticDefaultImports": true, - "alwaysStrict": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "skipLibCheck": true, - "esModuleInterop": true - }, - "types": [ - "./node_modules/@types/**", - "@types/jest", - "jest-websocket-mock", - "jest-playwright-preset", - "expect-playwright", - ], - "include": [ - "." - ], - "exclude": [ - "node_modules", - "dist", - "examples/**", - "plugins" - ] -} diff --git a/typedoc.json b/typedoc.json deleted file mode 100644 index 5bb87b0d..00000000 --- a/typedoc.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "entryPoints": [ - "src/iink.ts" - ], - "includes": "src", - "exclude": [ - "config", - "coverage", - "dist", - "docker", - "docs", - "examples", - "test", - "node_modules" - ], - "excludeTags": [ - "@override", - "@virtual", - "@privateRemarks", - "@hidden", - "@internal" - ], - "plugin": [ - "typedoc-plugin-missing-exports", - "./plugins/typdoc-default-object.ts" - ], - "sort": [ - "alphabetical", - ], - "excludeExternals": true, - "readme": "README.md", - "includeVersion": true, - "disableSources": false, - "githubPages": true, - "cleanOutputDir": true, - "categorizeByGroup": true, - "visibilityFilters": { - "protected": false, - "private": false, - "inherited": true, - "external": false, - "@alpha": false, - "@beta": false - } -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 9ca41c27..00000000 --- a/yarn.lock +++ /dev/null @@ -1,5749 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== - dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== - -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.5.2" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.43.0": - version "8.43.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" - integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/reporters" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.5.0" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-resolve-dependencies "^29.5.0" - jest-runner "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - jest-watcher "^29.5.0" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== - dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== - dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - jest-worker "^29.5.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - dependencies: - "@jest/schemas" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/plugin-node-resolve@^13.3.0": - version "13.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" - integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - deepmerge "^4.2.2" - is-builtin-module "^3.1.0" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@rollup/pluginutils@^4.1.2": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@*": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.2.0": - version "29.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" - integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jsdom@^16.2.4": - version "16.2.15" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.15.tgz#6c09990ec43b054e49636cba4d11d54367fc90d6" - integrity sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ== - dependencies: - "@types/node" "*" - "@types/parse5" "^6.0.3" - "@types/tough-cookie" "*" - -"@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== - -"@types/node@^18.11.5": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== - -"@types/parse5@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== - -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== - -"@types/wait-on@^5.2.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@types/wait-on/-/wait-on-5.3.1.tgz#bc5520d1d8b90b9caab1bef23315685ded73320d" - integrity sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.33.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" - integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/type-utils" "5.60.0" - "@typescript-eslint/utils" "5.60.0" - debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.33.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" - integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== - dependencies: - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" - integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== - dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" - -"@typescript-eslint/type-utils@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" - integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== - dependencies: - "@typescript-eslint/typescript-estree" "5.60.0" - "@typescript-eslint/utils" "5.60.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" - integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== - -"@typescript-eslint/typescript-estree@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" - integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== - dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.60.0", "@typescript-eslint/utils@^5.10.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" - integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" - integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== - dependencies: - "@typescript-eslint/types" "5.60.0" - eslint-visitor-keys "^3.3.0" - -abab@^2.0.5, abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.2: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-sequence-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" - integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^29.2.2, babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001503: - version "1.0.30001507" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz#fae53f6286e7564783eadea9b447819410a59534" - integrity sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A== - -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^3.5.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -common-tags@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-with-sourcemaps@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^3.0.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== - dependencies: - node-fetch "^2.6.11" - -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-js@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" - integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== - -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssfontparser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" - integrity sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg== - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.1: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -cwd@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" - integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== - dependencies: - find-pkg "^0.1.2" - fs-exists-sync "^0.1.0" - -data-urls@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js@^10.3.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== - dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -electron-to-chromium@^1.4.431: - version "1.4.439" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.439.tgz#d0748e8128c18f92354d3412dfb2104c3fb90e8f" - integrity sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== - dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-jest@^27.1.3: - version "27.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz#be4ded5f91905d9ec89aa8968d39c71f3b072c0c" - integrity sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-playwright@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.3.tgz#9fd8753688351bcaf41797eb6a7df8807fd5eb1b" - integrity sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@^8.22.0: - version "8.43.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" - integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.43.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== - dependencies: - os-homedir "^1.0.1" - -expect-playwright@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/expect-playwright/-/expect-playwright-0.8.0.tgz#6d4ebe0bdbdd3c1693d880d97153b96a129ae4e8" - integrity sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg== - -expect@^29.0.0, expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.2.0, find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-file-up@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" - integrity sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== - dependencies: - fs-exists-sync "^0.1.0" - resolve-dir "^0.1.0" - -find-pkg@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" - integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== - dependencies: - find-file-up "^0.1.2" - -find-process@^1.4.4: - version "1.4.7" - resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121" - integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg== - dependencies: - chalk "^4.0.0" - commander "^5.1.0" - debug "^4.1.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -generic-names@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-4.0.0.tgz#0bd8a2fd23fe8ea16cbd0a279acd69c06933d9a3" - integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== - dependencies: - loader-utils "^3.2.0" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -homedir-polyfill@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== - -icss-utils@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" - integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== - dependencies: - import-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.1, is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-canvas-mock@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.5.1.tgz#81509af658ef485e9a1bf39c64e06761517bdbcb" - integrity sha512-IVnRiz+v4EYn3ydM/pBo8GW/J+nU/Hg5gHBQQOUQhdRyNfvHnabB8ReqARLO0p+kvQghqr4V0tA92CF3JcUSRg== - dependencies: - cssfontparser "^1.2.1" - moo-color "^1.0.2" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-jsdom@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" - integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/jsdom" "^16.2.4" - "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - jsdom "^19.0.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-fetch-mock@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" - integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== - dependencies: - cross-fetch "^3.0.4" - promise-polyfill "^8.1.3" - -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-playwright-preset@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jest-playwright-preset/-/jest-playwright-preset-3.0.1.tgz#91c5c2bf4c87ba879d8d9a7ef914ff4904b05c3d" - integrity sha512-tHqv+JUmheNMZpmH7XyT5CAMHr3ExTUIY9baMPzcJiLYPvCaPTwig9YvuGGnXV2n+Epmch0Ld4429g6py0nq0w== - dependencies: - expect-playwright "^0.8.0" - jest-process-manager "^0.3.1" - nyc "^15.1.0" - playwright-core ">=1.2.0" - rimraf "^3.0.2" - uuid "^8.3.2" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-process-manager@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jest-process-manager/-/jest-process-manager-0.3.1.tgz#e748da83ea66ac5073087feb1150ba1270332b2e" - integrity sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw== - dependencies: - "@types/wait-on" "^5.2.0" - chalk "^4.1.0" - cwd "^0.10.0" - exit "^0.1.2" - find-process "^1.4.4" - prompts "^2.4.1" - signal-exit "^3.0.3" - spawnd "^5.0.0" - tree-kill "^1.2.2" - wait-on "^5.3.0" - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-transform-css@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jest-transform-css/-/jest-transform-css-6.0.1.tgz#95c579c98945734439c1f243b9843d5f477a9c60" - integrity sha512-i78Pi2MW6vcdsUFSRx1kPbjbEIO0pBWwh1Y+PcDrLwTv/6e5p7fzsV/gxFW/SYMHS8DUvMdRVTwVCkA/y+t0iQ== - dependencies: - common-tags "1.8.2" - cross-spawn "7.0.3" - postcss-load-config "4.0.1" - postcss-modules "4.3.1" - style-inject "0.3.0" - -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.0.0, jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - -jest-websocket-mock@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz#95ab1f89f809e57d2714427736ab7b1094fb1c3c" - integrity sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA== - dependencies: - jest-diff "^28.0.2" - mock-socket "^9.1.0" - -jest-worker@^26.2.1: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -joi@^17.3.0: - version "17.9.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== - dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-css@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/json-css/-/json-css-1.5.6.tgz#eb964f834a2e4eaa1bc2f698ff5db007a26c7c00" - integrity sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@2.2.2, json5@^2.2.2, json5@^2.2.3: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== - -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@^2.0.3, lilconfig@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -livereload-js@^3.3.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.4.1.tgz#ba90fbc708ed1b9a024bb89c4ee12c96ea03d66f" - integrity sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g== - -livereload@^0.9.1: - version "0.9.3" - resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" - integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== - dependencies: - chokidar "^3.5.0" - livereload-js "^3.3.1" - opts ">= 1.2.0" - ws "^7.4.3" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-utils@3.2.1, loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - -lodash.memoize@4.x, lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -magic-string@^0.25.2: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -magic-string@^0.26.6: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -marked@^4.2.12: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@>=2.4.6: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^7.1.3: - version "7.4.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" - integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mock-socket@^9.1.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.2.1.tgz#cc9c0810aa4d0afe02d721dcb2b7e657c00e2282" - integrity sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag== - -moo-color@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/moo-color/-/moo-color-1.0.3.tgz#d56435f8359c8284d83ac58016df7427febece74" - integrity sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ== - dependencies: - color-name "^1.1.4" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== - -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -opener@1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -"opts@>= 1.2.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" - integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== - -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -playwright-core@1.36.1: - version "1.36.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.36.1.tgz#f5f275d70548768ca892583519c89b237a381c77" - integrity sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg== - -playwright-core@>=1.2.0: - version "1.35.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" - integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== - -playwright@^1.36.1: - version "1.36.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.36.1.tgz#bd01541048b4ea54bcf1989e61e0129f34d2df71" - integrity sha512-2ZqHpD0U0COKR8bqR3W5IkyIAAM0mT9FgGJB9xWCI1qAUkqLxJskA1ueeQOTH2Qfz3+oxdwwf2EzdOX+RkZmmQ== - dependencies: - playwright-core "1.36.1" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-load-config@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-load-config@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-modules@4.3.1, postcss-modules@^4.0.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.3.1.tgz#517c06c09eab07d133ae0effca2c510abba18048" - integrity sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q== - dependencies: - generic-names "^4.0.0" - icss-replace-symbols "^1.1.0" - lodash.camelcase "^4.3.0" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - string-hash "^1.1.1" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.16: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -promise-polyfill@^8.1.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" - integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== - -promise.series@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" - integrity sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ== - -prompts@^2.0.1, prompts@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp.prototype.flags@^1.4.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.19.0, resolve@^1.20.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-commonjs@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" - integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== - dependencies: - estree-walker "^0.6.1" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-delete@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz#262acf80660d48c3b167fb0baabd0c3ab985c153" - integrity sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA== - dependencies: - del "^5.1.0" - -rollup-plugin-dts@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-4.2.3.tgz#04c3615df1ffab4228aa9d540697eaca61e01f47" - integrity sha512-jlcpItqM2efqfIiKzDB/IKOS9E9fDvbkJSGw5GtK/PqPGS9eC3R3JKyw2VvpTktZA+TNgJRMu1NTv244aTUzzQ== - dependencies: - magic-string "^0.26.6" - optionalDependencies: - "@babel/code-frame" "^7.18.6" - -rollup-plugin-livereload@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz#4747fa292a2cceb0c972c573d71b3d66b4252b37" - integrity sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA== - dependencies: - livereload "^0.9.1" - -rollup-plugin-postcss@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz#15e9462f39475059b368ce0e49c800fa4b1f7050" - integrity sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w== - dependencies: - chalk "^4.1.0" - concat-with-sourcemaps "^1.1.0" - cssnano "^5.0.1" - import-cwd "^3.0.0" - p-queue "^6.6.2" - pify "^5.0.0" - postcss-load-config "^3.0.0" - postcss-modules "^4.0.0" - promise.series "^0.2.0" - resolve "^1.19.0" - rollup-pluginutils "^2.8.2" - safe-identifier "^0.4.2" - style-inject "^0.3.0" - -rollup-plugin-serve@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-serve/-/rollup-plugin-serve-2.0.2.tgz#f49958b0725c9bd2fef976d23025a361e20bdee2" - integrity sha512-ALqyTbPhlf7FZ5RzlbDvMYvbKuCHWginJkTo6dMsbgji/a78IbsXox+pC83HENdkTRz8OXrTj+aShp3+3ratpg== - dependencies: - mime ">=2.4.6" - opener "1" - -rollup-plugin-terser@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - -rollup-plugin-typescript2@^0.32.1: - version "0.32.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz#470ded8e1965efac02043cc0ef4a7fa36bed83b9" - integrity sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw== - dependencies: - "@rollup/pluginutils" "^4.1.2" - find-cache-dir "^3.3.2" - fs-extra "^10.0.0" - resolve "^1.20.0" - tslib "^2.4.0" - -rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - -rollup@^2.76.0: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-identifier@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" - integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shiki@^0.14.1: - version "0.14.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.2.tgz#d51440800b701392b31ce2336036058e338247a1" - integrity sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A== - dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spawnd@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-5.0.0.tgz#ea72200bdc468998e84e1c3e7b914ce85fc1c32c" - integrity sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA== - dependencies: - exit "^0.1.2" - signal-exit "^3.0.3" - tree-kill "^1.2.2" - wait-port "^0.2.9" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-hash@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.padend@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" - integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-inject@0.3.0, style-inject@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" - integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terser@^5.0.0: - version "5.18.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" - integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-jest@^29.0.3: - version "29.1.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" - integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.4.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedoc-plugin-missing-exports@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz#7212a2cfaba7b48264df4b4110f3a5684b5c49a1" - integrity sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA== - -typedoc@^0.23.24: - version "0.23.28" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.28.tgz#3ce9c36ef1c273fa849d2dea18651855100d3ccd" - integrity sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w== - dependencies: - lunr "^2.3.9" - marked "^4.2.12" - minimatch "^7.1.3" - shiki "^0.14.1" - -typescript@^4.7.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== - dependencies: - xml-name-validator "^4.0.0" - -wait-on@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.3.0.tgz#584e17d4b3fe7b46ac2b9f8e5e102c005c2776c7" - integrity sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg== - dependencies: - axios "^0.21.1" - joi "^17.3.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^6.6.3" - -wait-port@^0.2.9: - version "0.2.14" - resolved "https://registry.yarnpkg.com/wait-port/-/wait-port-0.2.14.tgz#6df40629be2c95aa4073ceb895abef7d872b28c6" - integrity sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ== - dependencies: - chalk "^2.4.2" - commander "^3.0.2" - debug "^4.1.1" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@^1.2.12, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^7.4.3: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.2.3: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==