diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8c816609b32e95ee741f4abf769f4ceb874846d1..af1f52eab6365bb33ee4baea1fbd5fc9b0e0b0c4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -66,8 +66,8 @@ pages:
     - npm run test:production
     - mkdir -p public/dist
     - cp -rf generated/npm/* public/dist/
-    - 'cp generated/npm/browser/all.mjs public/dist/browser/$VERSION.mjs'
-    - 'cp generated/npm/nodejs/all.mjs public/dist/nodejs/$VERSION.mjs'
+    #- 'cp generated/npm/browser/all.mjs public/dist/browser/$VERSION.mjs'
+    #- 'cp generated/npm/nodejs/all.mjs public/dist/nodejs/$VERSION.mjs'
     - mv generated/coverage public/
     - mv generated/jscpd/html public/jscpd
     - mv generated/maintainability public/
diff --git a/package-lock.json b/package-lock.json
index 52f146d1bba64eacb76ca36a58a6e877826b5697..2fd60e5eb242d19b50a8a2f5567b1b296431a979 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,6 +22,7 @@
 				"browser-ava": "^1.1.0",
 				"c8": "^7.12.0",
 				"chokidar-cli": "^3.0.0",
+				"codehawk-cli": "^10.0.1",
 				"es6-plato": "https://github.com/1000i100/es6-plato#master",
 				"esbuild": "^0.15.15",
 				"eslint-plugin-ava": "^13.2.0",
@@ -34,6 +35,32 @@
 				"xo": "^0.53.1"
 			}
 		},
+		"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/@ampproject/remapping/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/@babel/code-frame": {
 			"version": "7.18.6",
 			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -46,6 +73,278 @@
 				"node": ">=6.9.0"
 			}
 		},
+		"node_modules/@babel/compat-data": {
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
+			"integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==",
+			"dev": true,
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
+		"node_modules/@babel/core": {
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
+			"integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
+			"dev": true,
+			"dependencies": {
+				"@ampproject/remapping": "^2.1.0",
+				"@babel/code-frame": "^7.18.6",
+				"@babel/generator": "^7.20.5",
+				"@babel/helper-compilation-targets": "^7.20.0",
+				"@babel/helper-module-transforms": "^7.20.2",
+				"@babel/helpers": "^7.20.5",
+				"@babel/parser": "^7.20.5",
+				"@babel/template": "^7.18.10",
+				"@babel/traverse": "^7.20.5",
+				"@babel/types": "^7.20.5",
+				"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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
+			"integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
+			"dev": true,
+			"dependencies": {
+				"@babel/types": "^7.20.5",
+				"@jridgewell/gen-mapping": "^0.3.2",
+				"jsesc": "^2.5.1"
+			},
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
+		"node_modules/@babel/generator/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/@babel/helper-annotate-as-pure": {
+			"version": "7.18.6",
+			"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+			"integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+			"dev": true,
+			"dependencies": {
+				"@babel/types": "^7.18.6"
+			},
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
+		"node_modules/@babel/helper-compilation-targets": {
+			"version": "7.20.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+			"integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+			"dev": true,
+			"dependencies": {
+				"@babel/compat-data": "^7.20.0",
+				"@babel/helper-validator-option": "^7.18.6",
+				"browserslist": "^4.21.3",
+				"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-create-class-features-plugin": {
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz",
+			"integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==",
+			"dev": true,
+			"dependencies": {
+				"@babel/helper-annotate-as-pure": "^7.18.6",
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-function-name": "^7.19.0",
+				"@babel/helper-member-expression-to-functions": "^7.18.9",
+				"@babel/helper-optimise-call-expression": "^7.18.6",
+				"@babel/helper-replace-supers": "^7.19.1",
+				"@babel/helper-split-export-declaration": "^7.18.6"
+			},
+			"engines": {
+				"node": ">=6.9.0"
+			},
+			"peerDependencies": {
+				"@babel/core": "^7.0.0"
+			}
+		},
+		"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.19.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+			"integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+			"dev": true,
+			"dependencies": {
+				"@babel/template": "^7.18.10",
+				"@babel/types": "^7.19.0"
+			},
+			"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-member-expression-to-functions": {
+			"version": "7.18.9",
+			"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
+			"integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+			"dev": true,
+			"dependencies": {
+				"@babel/types": "^7.18.9"
+			},
+			"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.20.2",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+			"integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+			"dev": true,
+			"dependencies": {
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-module-imports": "^7.18.6",
+				"@babel/helper-simple-access": "^7.20.2",
+				"@babel/helper-split-export-declaration": "^7.18.6",
+				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/template": "^7.18.10",
+				"@babel/traverse": "^7.20.1",
+				"@babel/types": "^7.20.2"
+			},
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
+		"node_modules/@babel/helper-optimise-call-expression": {
+			"version": "7.18.6",
+			"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+			"integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+			"dev": true,
+			"dependencies": {
+				"@babel/types": "^7.18.6"
+			},
+			"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-replace-supers": {
+			"version": "7.19.1",
+			"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
+			"integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==",
+			"dev": true,
+			"dependencies": {
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-member-expression-to-functions": "^7.18.9",
+				"@babel/helper-optimise-call-expression": "^7.18.6",
+				"@babel/traverse": "^7.19.1",
+				"@babel/types": "^7.19.0"
+			},
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
+		"node_modules/@babel/helper-simple-access": {
+			"version": "7.20.2",
+			"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+			"integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+			"dev": true,
+			"dependencies": {
+				"@babel/types": "^7.20.2"
+			},
+			"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.19.4",
 			"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
@@ -64,6 +363,29 @@
 				"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.20.6",
+			"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
+			"integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==",
+			"dev": true,
+			"dependencies": {
+				"@babel/template": "^7.18.10",
+				"@babel/traverse": "^7.20.5",
+				"@babel/types": "^7.20.5"
+			},
+			"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",
@@ -135,9 +457,9 @@
 			}
 		},
 		"node_modules/@babel/parser": {
-			"version": "7.20.3",
-			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-			"integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
+			"integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
 			"dev": true,
 			"bin": {
 				"parser": "bin/babel-parser.js"
@@ -146,10 +468,86 @@
 				"node": ">=6.0.0"
 			}
 		},
-		"node_modules/@babel/types": {
+		"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/plugin-transform-typescript": {
 			"version": "7.20.2",
-			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-			"integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz",
+			"integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==",
+			"dev": true,
+			"dependencies": {
+				"@babel/helper-create-class-features-plugin": "^7.20.2",
+				"@babel/helper-plugin-utils": "^7.20.2",
+				"@babel/plugin-syntax-typescript": "^7.20.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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
+			"integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==",
+			"dev": true,
+			"dependencies": {
+				"@babel/code-frame": "^7.18.6",
+				"@babel/generator": "^7.20.5",
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-function-name": "^7.19.0",
+				"@babel/helper-hoist-variables": "^7.18.6",
+				"@babel/helper-split-export-declaration": "^7.18.6",
+				"@babel/parser": "^7.20.5",
+				"@babel/types": "^7.20.5",
+				"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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
+			"integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==",
 			"dev": true,
 			"dependencies": {
 				"@babel/helper-string-parser": "^7.19.4",
@@ -278,7 +676,6 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
 			"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"@jridgewell/set-array": "^1.0.1",
 				"@jridgewell/sourcemap-codec": "^1.4.10",
@@ -302,7 +699,6 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
 			"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
 			"dev": true,
-			"peer": true,
 			"engines": {
 				"node": ">=6.0.0"
 			}
@@ -535,6 +931,16 @@
 			"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
 			"dev": true
 		},
+		"node_modules/@typhonjs/babel-parser": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/@typhonjs/babel-parser/-/babel-parser-0.2.0.tgz",
+			"integrity": "sha512-YKqLZaQAVtOjMiqcJIqex1ezduMefBitoQZjsOqr4US+Yq+cOY/obyloOJ7Ee+XDPaaraVrxWkA3VZjOohtVjQ==",
+			"dev": true,
+			"dependencies": {
+				"@babel/parser": "^7.0.0",
+				"babel-runtime": "^6.0.0"
+			}
+		},
 		"node_modules/@webassemblyjs/ast": {
 			"version": "1.11.1",
 			"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -1054,6 +1460,16 @@
 				}
 			}
 		},
+		"node_modules/babel-runtime": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+			"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+			"dev": true,
+			"dependencies": {
+				"core-js": "^2.4.0",
+				"regenerator-runtime": "^0.11.0"
+			}
+		},
 		"node_modules/babel-walk": {
 			"version": "3.0.0-canary-5",
 			"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
@@ -1075,6 +1491,15 @@
 				"babylon": "bin/babylon.js"
 			}
 		},
+		"node_modules/backbone-esnext-events": {
+			"version": "0.3.5",
+			"resolved": "https://registry.npmjs.org/backbone-esnext-events/-/backbone-esnext-events-0.3.5.tgz",
+			"integrity": "sha512-n208qnhO6kARjSHLZIBs1w6ECpybIBzFE6X1x2XTIGx+U+6qlSctizq9bCh+Xf5XHsSyipIgoxc1grZG7nCxfw==",
+			"dev": true,
+			"dependencies": {
+				"babel-runtime": "^6.0.0"
+			}
+		},
 		"node_modules/badgen": {
 			"version": "3.2.2",
 			"resolved": "https://registry.npmjs.org/badgen/-/badgen-3.2.2.tgz",
@@ -1190,7 +1615,6 @@
 					"url": "https://tidelift.com/funding/github/npm/browserslist"
 				}
 			],
-			"peer": true,
 			"dependencies": {
 				"caniuse-lite": "^1.0.30001400",
 				"electron-to-chromium": "^1.4.251",
@@ -1440,8 +1864,7 @@
 					"type": "tidelift",
 					"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
 				}
-			],
-			"peer": true
+			]
 		},
 		"node_modules/cbor": {
 			"version": "8.1.0",
@@ -1943,7 +2366,157 @@
 			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 			"dev": true
 		},
-		"node_modules/cliui/node_modules/is-fullwidth-code-point": {
+		"node_modules/cliui/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/cliui/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/cliui/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/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/code-excerpt": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz",
+			"integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==",
+			"dev": true,
+			"dependencies": {
+				"convert-to-spaces": "^2.0.1"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			}
+		},
+		"node_modules/codehawk-cli": {
+			"version": "10.0.1",
+			"resolved": "https://registry.npmjs.org/codehawk-cli/-/codehawk-cli-10.0.1.tgz",
+			"integrity": "sha512-L8c0gkA1CwJEILFg4SL4t1xOhhvCc+pZtrlaJoBA427kjZZPwepx9E9jWxiz2E5K+5GZZ9VhoAchfClIBHZVEg==",
+			"dev": true,
+			"dependencies": {
+				"@babel/core": "^7.18.6",
+				"@babel/plugin-transform-typescript": "^7.18.6",
+				"badgen": "^3.2.2",
+				"flow-remove-types": "^2.111.3",
+				"is-dotdir": "^1.0.1",
+				"is-dotfile": "^2.0.0",
+				"slash": "^3.0.0",
+				"typhonjs-escomplex": "^0.1.0",
+				"yargs": "^16.2.0"
+			},
+			"bin": {
+				"codehawk": "build/index.js",
+				"codehawk-cli": "build/index.js"
+			},
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/codehawk-cli/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/codehawk-cli/node_modules/cliui": {
+			"version": "7.0.4",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+			"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+			"dev": true,
+			"dependencies": {
+				"string-width": "^4.2.0",
+				"strip-ansi": "^6.0.0",
+				"wrap-ansi": "^7.0.0"
+			}
+		},
+		"node_modules/codehawk-cli/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/codehawk-cli/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/codehawk-cli/node_modules/escomplex-plugin-metrics-module": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-module/-/escomplex-plugin-metrics-module-0.1.0.tgz",
+			"integrity": "sha512-lEHGInx1gAfgIRJeSTXggTvfEtIG061G0Kzk4hIq0qN6nd2prXZihAPRuLB9DdxCmxXvLVFqi+Bnun9rDw1/zg==",
+			"dev": true,
+			"dependencies": {
+				"typhonjs-escomplex-commons": "^0.1.0"
+			}
+		},
+		"node_modules/codehawk-cli/node_modules/escomplex-plugin-metrics-project": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-project/-/escomplex-plugin-metrics-project-0.1.0.tgz",
+			"integrity": "sha512-/9Nf2UJ77qo3TBuWwvFnuNPziHC50nPOxldTZvCEzvwePp+BdI5whlDnJHV9rh3gT75CFODJDM80mBJI+px6/g==",
+			"dev": true,
+			"dependencies": {
+				"typhonjs-escomplex-commons": "^0.1.0"
+			}
+		},
+		"node_modules/codehawk-cli/node_modules/escomplex-plugin-syntax-babylon": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-babylon/-/escomplex-plugin-syntax-babylon-0.1.0.tgz",
+			"integrity": "sha512-KNjE0Rf1jNteb7zwFyv4G3+TIuHqUfnmXpRf5u9iJkrbVXjmbC7Fg5UEA1Net8gvoV9RLVImFFaLZxclaagqAA==",
+			"dev": true,
+			"dependencies": {
+				"escomplex-plugin-syntax-estree": "^0.1.0",
+				"typhonjs-escomplex-commons": "^0.1.0"
+			}
+		},
+		"node_modules/codehawk-cli/node_modules/escomplex-plugin-syntax-estree": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-estree/-/escomplex-plugin-syntax-estree-0.1.0.tgz",
+			"integrity": "sha512-uhgBgEhq91rq+1OStjDwpxpS5ehQdq1X/Y7DYCQHplczJN9ZzyoiHostZ4CqywLgDkyicvIyt/8LBYjBaNFc7w==",
+			"dev": true,
+			"dependencies": {
+				"typhonjs-escomplex-commons": "^0.1.0"
+			}
+		},
+		"node_modules/codehawk-cli/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==",
@@ -1952,7 +2525,7 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/cliui/node_modules/string-width": {
+		"node_modules/codehawk-cli/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==",
@@ -1966,7 +2539,7 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/cliui/node_modules/strip-ansi": {
+		"node_modules/codehawk-cli/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==",
@@ -1978,26 +2551,82 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/co": {
-			"version": "4.6.0",
-			"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-			"integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+		"node_modules/codehawk-cli/node_modules/typhonjs-ast-walker": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/typhonjs-ast-walker/-/typhonjs-ast-walker-0.2.1.tgz",
+			"integrity": "sha512-CpnkW3kxunDwKW2y99jqHCAPqhUzY9T033TM/GOWvtSIP33xy7kOPzp8hPx+Ns2Z4Q7n7PkFqUGPy/ijs3Y3eA==",
+			"dev": true
+		},
+		"node_modules/codehawk-cli/node_modules/typhonjs-escomplex": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/typhonjs-escomplex/-/typhonjs-escomplex-0.1.0.tgz",
+			"integrity": "sha512-B2r31mRH/ZuuogZADqOBP4NPnqBH2mzEP+Pjm+5R8/z0iHLwUTRadkDQL4yv33qsHdIHlvnpOHh6iUo69v2mPA==",
 			"dev": true,
-			"engines": {
-				"iojs": ">= 1.0.0",
-				"node": ">= 0.12.0"
+			"dependencies": {
+				"@typhonjs/babel-parser": "^0.2.0",
+				"commander": "^2.0.0",
+				"typhonjs-escomplex-module": "^0.1.0",
+				"typhonjs-escomplex-project": "^0.1.0"
 			}
 		},
-		"node_modules/code-excerpt": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz",
-			"integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==",
+		"node_modules/codehawk-cli/node_modules/typhonjs-escomplex-commons": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/typhonjs-escomplex-commons/-/typhonjs-escomplex-commons-0.1.1.tgz",
+			"integrity": "sha512-nIeiokmcupP3t34KVhynHi0LrjMM6QzbHiwK8+Kl/GnAq4o/jK+cCiu4Zt9mZgJKUzUGRtW1kqoZI2RlAchkgg==",
+			"dev": true
+		},
+		"node_modules/codehawk-cli/node_modules/typhonjs-escomplex-module": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/typhonjs-escomplex-module/-/typhonjs-escomplex-module-0.1.0.tgz",
+			"integrity": "sha512-ViviuBg7Etrl8HeQcwQ9gui9s0rpnFPXltXUFAvOzeQScb+xrLijBq7Z0cveriKQegne/tGTn4ljZg0prwDyTw==",
 			"dev": true,
 			"dependencies": {
-				"convert-to-spaces": "^2.0.1"
+				"escomplex-plugin-metrics-module": "^0.1.0",
+				"escomplex-plugin-syntax-babylon": "^0.1.0",
+				"typhonjs-ast-walker": "^0.2.0",
+				"typhonjs-escomplex-commons": "^0.1.0",
+				"typhonjs-plugin-manager": "^0.2.0"
+			}
+		},
+		"node_modules/codehawk-cli/node_modules/typhonjs-escomplex-project": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/typhonjs-escomplex-project/-/typhonjs-escomplex-project-0.1.0.tgz",
+			"integrity": "sha512-2NdkUsDmxcgsNFqn14CYl5Xfzlig7kKtU/ACOLRN6/nP9c3rlHizVr8YdBYRf2H1sOjmjfNmbC6i1RVnnJZxZQ==",
+			"dev": true,
+			"dependencies": {
+				"escomplex-plugin-metrics-project": "^0.1.0",
+				"typhonjs-escomplex-commons": "^0.1.0",
+				"typhonjs-escomplex-module": "^0.1.0",
+				"typhonjs-plugin-manager": "^0.2.0"
+			}
+		},
+		"node_modules/codehawk-cli/node_modules/typhonjs-plugin-manager": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/typhonjs-plugin-manager/-/typhonjs-plugin-manager-0.2.0.tgz",
+			"integrity": "sha512-Plo2Z8jGLNlhoVOUFU5Dm2Vj/rjnaZycCSdklFeVXq3/+qo6k855Aya0WrkLTdjdj+spes60mRXyQnxHxXcHUQ==",
+			"dev": true,
+			"dependencies": {
+				"babel-runtime": "^6.0.0",
+				"backbone-esnext-events": "<1.0.0",
+				"typhonjs-object-util": "^0.4.0"
+			}
+		},
+		"node_modules/codehawk-cli/node_modules/yargs": {
+			"version": "16.2.0",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+			"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+			"dev": true,
+			"dependencies": {
+				"cliui": "^7.0.2",
+				"escalade": "^3.1.1",
+				"get-caller-file": "^2.0.5",
+				"require-directory": "^2.1.1",
+				"string-width": "^4.2.0",
+				"y18n": "^5.0.5",
+				"yargs-parser": "^20.2.2"
 			},
 			"engines": {
-				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+				"node": ">=10"
 			}
 		},
 		"node_modules/color-convert": {
@@ -2152,6 +2781,14 @@
 				"node": ">= 0.8"
 			}
 		},
+		"node_modules/core-js": {
+			"version": "2.6.12",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+			"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+			"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+			"dev": true,
+			"hasInstallScript": true
+		},
 		"node_modules/cosmiconfig": {
 			"version": "7.1.0",
 			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@@ -2412,6 +3049,24 @@
 			"integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==",
 			"dev": true
 		},
+		"node_modules/dotdir-regex": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/dotdir-regex/-/dotdir-regex-1.0.1.tgz",
+			"integrity": "sha512-kdFn3THtHoTIRKKaGXxKgsWD1VEcoWTjts+EX8qY+ydvMC3GjxWvcu5mclkXBTO9eDJkEYhJV4uF9PpaTgIHVw==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/dotfile-regex": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/dotfile-regex/-/dotfile-regex-0.1.2.tgz",
+			"integrity": "sha512-/aYlowqO6BnhSQC+snSjl7pdlDRngDVx69cr03Wv3oTJM4k+9L453pPsMeGRKwm0HmwNG+TncX2OZenSIF14iw==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
 		"node_modules/eastasianwidth": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -2437,8 +3092,7 @@
 			"version": "1.4.271",
 			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.271.tgz",
 			"integrity": "sha512-BCPBtK07xR1/uY2HFDtl3wK2De66AW4MSiPlLrnPNxKC/Qhccxd59W73654S3y6Rb/k3hmuGJOBnhjfoutetXA==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"node_modules/emittery": {
 			"version": "1.0.1",
@@ -4670,6 +5324,33 @@
 			"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
 			"dev": true
 		},
+		"node_modules/flow-parser": {
+			"version": "0.194.0",
+			"resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.194.0.tgz",
+			"integrity": "sha512-3dipGWKnXmE4LEE5yCPHJrSlMYOPAYU7wMBecfKiWPQSZp1CvkpJ59dfuuUIeM2TSttKGSatep77vGG9cjkeqg==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.4.0"
+			}
+		},
+		"node_modules/flow-remove-types": {
+			"version": "2.194.0",
+			"resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.194.0.tgz",
+			"integrity": "sha512-/tkRSpCkjas9c2IZblDAgvAyd8atLYAHcenwupaRNiZGQva6tNjOHw7nj5kR+C4n2lvxQdrAs1jpZoD1ziN04g==",
+			"dev": true,
+			"dependencies": {
+				"flow-parser": "^0.194.0",
+				"pirates": "^3.0.2",
+				"vlq": "^0.2.1"
+			},
+			"bin": {
+				"flow-node": "flow-node",
+				"flow-remove-types": "flow-remove-types"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
 		"node_modules/foreground-child": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
@@ -4766,6 +5447,15 @@
 				"url": "https://github.com/sponsors/ljharb"
 			}
 		},
+		"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",
@@ -5523,6 +6213,30 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"node_modules/is-dotdir": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-dotdir/-/is-dotdir-1.0.1.tgz",
+			"integrity": "sha512-ilM6A5vLGu0Gtma06HS9a9nnrxXF3ElJGqWuG3nBL+R/LwUcgS0FpQDurMrWO11QhOHdlejEBTfPWhIwV9xikQ==",
+			"dev": true,
+			"dependencies": {
+				"dotdir-regex": "^1.0.1"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/is-dotfile": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-2.0.0.tgz",
+			"integrity": "sha512-51SpFowbv7bHGrAJ9u+eqitdXZFPrr9m9vEzN3YGkN8XpYN0RF/6s7l8rQgyuBbNjeq8DPvpG6t3y3ZjUSHVDg==",
+			"dev": true,
+			"dependencies": {
+				"dotfile-regex": "^0.1.2"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
 		"node_modules/is-error": {
 			"version": "2.2.2",
 			"resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz",
@@ -7033,12 +7747,20 @@
 				}
 			}
 		},
+		"node_modules/node-modules-regexp": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+			"integrity": "sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
 		"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,
-			"peer": true
+			"dev": true
 		},
 		"node_modules/nofilter": {
 			"version": "3.1.0",
@@ -7702,8 +8424,7 @@
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
 			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"node_modules/picomatch": {
 			"version": "2.3.1",
@@ -7738,6 +8459,18 @@
 				"node": ">=4"
 			}
 		},
+		"node_modules/pirates": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz",
+			"integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==",
+			"dev": true,
+			"dependencies": {
+				"node-modules-regexp": "^1.0.0"
+			},
+			"engines": {
+				"node": ">= 4"
+			}
+		},
 		"node_modules/pkg-conf": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz",
@@ -8388,6 +9121,12 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"node_modules/regenerator-runtime": {
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+			"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+			"dev": true
+		},
 		"node_modules/regexp-tree": {
 			"version": "0.1.24",
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
@@ -9610,6 +10349,15 @@
 			"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
 			"dev": true
 		},
+		"node_modules/typhonjs-object-util": {
+			"version": "0.4.2",
+			"resolved": "https://registry.npmjs.org/typhonjs-object-util/-/typhonjs-object-util-0.4.2.tgz",
+			"integrity": "sha512-qs4Mn45ryJBNbXQ+QV1vvz4h0c0ED5my+XFo5Kp5iEIbA3KGuJZjI5AEAucfPLEX6VDZ2eJQqMkrstxLY5jTdw==",
+			"dev": true,
+			"dependencies": {
+				"babel-runtime": "^6.0.0"
+			}
+		},
 		"node_modules/typhonjs-plugin-manager": {
 			"version": "0.0.3",
 			"resolved": "https://registry.npmjs.org/typhonjs-plugin-manager/-/typhonjs-plugin-manager-0.0.3.tgz",
@@ -9688,7 +10436,6 @@
 					"url": "https://tidelift.com/funding/github/npm/browserslist"
 				}
 			],
-			"peer": true,
 			"dependencies": {
 				"escalade": "^3.1.1",
 				"picocolors": "^1.0.0"
@@ -9757,6 +10504,12 @@
 				"node": ">= 0.8"
 			}
 		},
+		"node_modules/vlq": {
+			"version": "0.2.3",
+			"resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+			"integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+			"dev": true
+		},
 		"node_modules/void-elements": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@@ -11149,36 +11902,263 @@
 				"node": ">=12"
 			}
 		},
-		"node_modules/ylru": {
-			"version": "1.3.2",
-			"resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz",
-			"integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==",
+		"node_modules/ylru": {
+			"version": "1.3.2",
+			"resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz",
+			"integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==",
+			"dev": true,
+			"engines": {
+				"node": ">= 4.0.0"
+			}
+		},
+		"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"
+			},
+			"dependencies": {
+				"@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"
+					}
+				}
+			}
+		},
+		"@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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
+			"integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==",
+			"dev": true
+		},
+		"@babel/core": {
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
+			"integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
+			"dev": true,
+			"requires": {
+				"@ampproject/remapping": "^2.1.0",
+				"@babel/code-frame": "^7.18.6",
+				"@babel/generator": "^7.20.5",
+				"@babel/helper-compilation-targets": "^7.20.0",
+				"@babel/helper-module-transforms": "^7.20.2",
+				"@babel/helpers": "^7.20.5",
+				"@babel/parser": "^7.20.5",
+				"@babel/template": "^7.18.10",
+				"@babel/traverse": "^7.20.5",
+				"@babel/types": "^7.20.5",
+				"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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
+			"integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.20.5",
+				"@jridgewell/gen-mapping": "^0.3.2",
+				"jsesc": "^2.5.1"
+			},
+			"dependencies": {
+				"jsesc": {
+					"version": "2.5.2",
+					"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+					"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+					"dev": true
+				}
+			}
+		},
+		"@babel/helper-annotate-as-pure": {
+			"version": "7.18.6",
+			"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+			"integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.18.6"
+			}
+		},
+		"@babel/helper-compilation-targets": {
+			"version": "7.20.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+			"integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+			"dev": true,
+			"requires": {
+				"@babel/compat-data": "^7.20.0",
+				"@babel/helper-validator-option": "^7.18.6",
+				"browserslist": "^4.21.3",
+				"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-create-class-features-plugin": {
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz",
+			"integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-annotate-as-pure": "^7.18.6",
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-function-name": "^7.19.0",
+				"@babel/helper-member-expression-to-functions": "^7.18.9",
+				"@babel/helper-optimise-call-expression": "^7.18.6",
+				"@babel/helper-replace-supers": "^7.19.1",
+				"@babel/helper-split-export-declaration": "^7.18.6"
+			}
+		},
+		"@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.19.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+			"integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+			"dev": true,
+			"requires": {
+				"@babel/template": "^7.18.10",
+				"@babel/types": "^7.19.0"
+			}
+		},
+		"@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-member-expression-to-functions": {
+			"version": "7.18.9",
+			"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
+			"integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.18.9"
+			}
+		},
+		"@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.20.2",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+			"integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-module-imports": "^7.18.6",
+				"@babel/helper-simple-access": "^7.20.2",
+				"@babel/helper-split-export-declaration": "^7.18.6",
+				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/template": "^7.18.10",
+				"@babel/traverse": "^7.20.1",
+				"@babel/types": "^7.20.2"
+			}
+		},
+		"@babel/helper-optimise-call-expression": {
+			"version": "7.18.6",
+			"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+			"integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.18.6"
+			}
+		},
+		"@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-replace-supers": {
+			"version": "7.19.1",
+			"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
+			"integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==",
 			"dev": true,
-			"engines": {
-				"node": ">= 4.0.0"
+			"requires": {
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-member-expression-to-functions": "^7.18.9",
+				"@babel/helper-optimise-call-expression": "^7.18.6",
+				"@babel/traverse": "^7.19.1",
+				"@babel/types": "^7.19.0"
 			}
 		},
-		"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==",
+		"@babel/helper-simple-access": {
+			"version": "7.20.2",
+			"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+			"integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
 			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
+			"requires": {
+				"@babel/types": "^7.20.2"
 			}
-		}
-	},
-	"dependencies": {
-		"@babel/code-frame": {
+		},
+		"@babel/helper-split-export-declaration": {
 			"version": "7.18.6",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
-			"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+			"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/highlight": "^7.18.6"
+				"@babel/types": "^7.18.6"
 			}
 		},
 		"@babel/helper-string-parser": {
@@ -11193,6 +12173,23 @@
 			"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
 			"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.20.6",
+			"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
+			"integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==",
+			"dev": true,
+			"requires": {
+				"@babel/template": "^7.18.10",
+				"@babel/traverse": "^7.20.5",
+				"@babel/types": "^7.20.5"
+			}
+		},
 		"@babel/highlight": {
 			"version": "7.18.6",
 			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
@@ -11248,15 +12245,72 @@
 			}
 		},
 		"@babel/parser": {
-			"version": "7.20.3",
-			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-			"integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+			"version": "7.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
+			"integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
 			"dev": true
 		},
-		"@babel/types": {
+		"@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/plugin-transform-typescript": {
 			"version": "7.20.2",
-			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-			"integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz",
+			"integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-create-class-features-plugin": "^7.20.2",
+				"@babel/helper-plugin-utils": "^7.20.2",
+				"@babel/plugin-syntax-typescript": "^7.20.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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
+			"integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==",
+			"dev": true,
+			"requires": {
+				"@babel/code-frame": "^7.18.6",
+				"@babel/generator": "^7.20.5",
+				"@babel/helper-environment-visitor": "^7.18.9",
+				"@babel/helper-function-name": "^7.19.0",
+				"@babel/helper-hoist-variables": "^7.18.6",
+				"@babel/helper-split-export-declaration": "^7.18.6",
+				"@babel/parser": "^7.20.5",
+				"@babel/types": "^7.20.5",
+				"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.20.5",
+			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
+			"integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==",
 			"dev": true,
 			"requires": {
 				"@babel/helper-string-parser": "^7.19.4",
@@ -11342,7 +12396,6 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
 			"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
 			"dev": true,
-			"peer": true,
 			"requires": {
 				"@jridgewell/set-array": "^1.0.1",
 				"@jridgewell/sourcemap-codec": "^1.4.10",
@@ -11359,8 +12412,7 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
 			"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"@jridgewell/source-map": {
 			"version": "0.3.2",
@@ -11572,6 +12624,16 @@
 			"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
 			"dev": true
 		},
+		"@typhonjs/babel-parser": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/@typhonjs/babel-parser/-/babel-parser-0.2.0.tgz",
+			"integrity": "sha512-YKqLZaQAVtOjMiqcJIqex1ezduMefBitoQZjsOqr4US+Yq+cOY/obyloOJ7Ee+XDPaaraVrxWkA3VZjOohtVjQ==",
+			"dev": true,
+			"requires": {
+				"@babel/parser": "^7.0.0",
+				"babel-runtime": "^6.0.0"
+			}
+		},
 		"@webassemblyjs/ast": {
 			"version": "1.11.1",
 			"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -11991,6 +13053,16 @@
 				"yargs": "^17.6.2"
 			}
 		},
+		"babel-runtime": {
+			"version": "6.26.0",
+			"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+			"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+			"dev": true,
+			"requires": {
+				"core-js": "^2.4.0",
+				"regenerator-runtime": "^0.11.0"
+			}
+		},
 		"babel-walk": {
 			"version": "3.0.0-canary-5",
 			"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
@@ -12006,6 +13078,15 @@
 			"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
 			"dev": true
 		},
+		"backbone-esnext-events": {
+			"version": "0.3.5",
+			"resolved": "https://registry.npmjs.org/backbone-esnext-events/-/backbone-esnext-events-0.3.5.tgz",
+			"integrity": "sha512-n208qnhO6kARjSHLZIBs1w6ECpybIBzFE6X1x2XTIGx+U+6qlSctizq9bCh+Xf5XHsSyipIgoxc1grZG7nCxfw==",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.0.0"
+			}
+		},
 		"badgen": {
 			"version": "3.2.2",
 			"resolved": "https://registry.npmjs.org/badgen/-/badgen-3.2.2.tgz",
@@ -12095,7 +13176,6 @@
 			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
 			"integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
 			"dev": true,
-			"peer": true,
 			"requires": {
 				"caniuse-lite": "^1.0.30001400",
 				"electron-to-chromium": "^1.4.251",
@@ -12273,8 +13353,7 @@
 			"version": "1.0.30001415",
 			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001415.tgz",
 			"integrity": "sha512-ER+PfgCJUe8BqunLGWd/1EY4g8AzQcsDAVzdtMGKVtQEmKAwaFfU6vb7EAVIqTMYsqxBorYZi2+22Iouj/y7GQ==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"cbor": {
 			"version": "8.1.0",
@@ -12700,6 +13779,192 @@
 				"convert-to-spaces": "^2.0.1"
 			}
 		},
+		"codehawk-cli": {
+			"version": "10.0.1",
+			"resolved": "https://registry.npmjs.org/codehawk-cli/-/codehawk-cli-10.0.1.tgz",
+			"integrity": "sha512-L8c0gkA1CwJEILFg4SL4t1xOhhvCc+pZtrlaJoBA427kjZZPwepx9E9jWxiz2E5K+5GZZ9VhoAchfClIBHZVEg==",
+			"dev": true,
+			"requires": {
+				"@babel/core": "^7.18.6",
+				"@babel/plugin-transform-typescript": "^7.18.6",
+				"badgen": "^3.2.2",
+				"flow-remove-types": "^2.111.3",
+				"is-dotdir": "^1.0.1",
+				"is-dotfile": "^2.0.0",
+				"slash": "^3.0.0",
+				"typhonjs-escomplex": "^0.1.0",
+				"yargs": "^16.2.0"
+			},
+			"dependencies": {
+				"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
+				},
+				"cliui": {
+					"version": "7.0.4",
+					"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+					"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+					"dev": true,
+					"requires": {
+						"string-width": "^4.2.0",
+						"strip-ansi": "^6.0.0",
+						"wrap-ansi": "^7.0.0"
+					}
+				},
+				"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
+				},
+				"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
+				},
+				"escomplex-plugin-metrics-module": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-module/-/escomplex-plugin-metrics-module-0.1.0.tgz",
+					"integrity": "sha512-lEHGInx1gAfgIRJeSTXggTvfEtIG061G0Kzk4hIq0qN6nd2prXZihAPRuLB9DdxCmxXvLVFqi+Bnun9rDw1/zg==",
+					"dev": true,
+					"requires": {
+						"typhonjs-escomplex-commons": "^0.1.0"
+					}
+				},
+				"escomplex-plugin-metrics-project": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-project/-/escomplex-plugin-metrics-project-0.1.0.tgz",
+					"integrity": "sha512-/9Nf2UJ77qo3TBuWwvFnuNPziHC50nPOxldTZvCEzvwePp+BdI5whlDnJHV9rh3gT75CFODJDM80mBJI+px6/g==",
+					"dev": true,
+					"requires": {
+						"typhonjs-escomplex-commons": "^0.1.0"
+					}
+				},
+				"escomplex-plugin-syntax-babylon": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-babylon/-/escomplex-plugin-syntax-babylon-0.1.0.tgz",
+					"integrity": "sha512-KNjE0Rf1jNteb7zwFyv4G3+TIuHqUfnmXpRf5u9iJkrbVXjmbC7Fg5UEA1Net8gvoV9RLVImFFaLZxclaagqAA==",
+					"dev": true,
+					"requires": {
+						"escomplex-plugin-syntax-estree": "^0.1.0",
+						"typhonjs-escomplex-commons": "^0.1.0"
+					}
+				},
+				"escomplex-plugin-syntax-estree": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-estree/-/escomplex-plugin-syntax-estree-0.1.0.tgz",
+					"integrity": "sha512-uhgBgEhq91rq+1OStjDwpxpS5ehQdq1X/Y7DYCQHplczJN9ZzyoiHostZ4CqywLgDkyicvIyt/8LBYjBaNFc7w==",
+					"dev": true,
+					"requires": {
+						"typhonjs-escomplex-commons": "^0.1.0"
+					}
+				},
+				"is-fullwidth-code-point": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+					"dev": true
+				},
+				"string-width": {
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+					"dev": true,
+					"requires": {
+						"emoji-regex": "^8.0.0",
+						"is-fullwidth-code-point": "^3.0.0",
+						"strip-ansi": "^6.0.1"
+					}
+				},
+				"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"
+					}
+				},
+				"typhonjs-ast-walker": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/typhonjs-ast-walker/-/typhonjs-ast-walker-0.2.1.tgz",
+					"integrity": "sha512-CpnkW3kxunDwKW2y99jqHCAPqhUzY9T033TM/GOWvtSIP33xy7kOPzp8hPx+Ns2Z4Q7n7PkFqUGPy/ijs3Y3eA==",
+					"dev": true
+				},
+				"typhonjs-escomplex": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/typhonjs-escomplex/-/typhonjs-escomplex-0.1.0.tgz",
+					"integrity": "sha512-B2r31mRH/ZuuogZADqOBP4NPnqBH2mzEP+Pjm+5R8/z0iHLwUTRadkDQL4yv33qsHdIHlvnpOHh6iUo69v2mPA==",
+					"dev": true,
+					"requires": {
+						"@typhonjs/babel-parser": "^0.2.0",
+						"commander": "^2.0.0",
+						"typhonjs-escomplex-module": "^0.1.0",
+						"typhonjs-escomplex-project": "^0.1.0"
+					}
+				},
+				"typhonjs-escomplex-commons": {
+					"version": "0.1.1",
+					"resolved": "https://registry.npmjs.org/typhonjs-escomplex-commons/-/typhonjs-escomplex-commons-0.1.1.tgz",
+					"integrity": "sha512-nIeiokmcupP3t34KVhynHi0LrjMM6QzbHiwK8+Kl/GnAq4o/jK+cCiu4Zt9mZgJKUzUGRtW1kqoZI2RlAchkgg==",
+					"dev": true
+				},
+				"typhonjs-escomplex-module": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/typhonjs-escomplex-module/-/typhonjs-escomplex-module-0.1.0.tgz",
+					"integrity": "sha512-ViviuBg7Etrl8HeQcwQ9gui9s0rpnFPXltXUFAvOzeQScb+xrLijBq7Z0cveriKQegne/tGTn4ljZg0prwDyTw==",
+					"dev": true,
+					"requires": {
+						"escomplex-plugin-metrics-module": "^0.1.0",
+						"escomplex-plugin-syntax-babylon": "^0.1.0",
+						"typhonjs-ast-walker": "^0.2.0",
+						"typhonjs-escomplex-commons": "^0.1.0",
+						"typhonjs-plugin-manager": "^0.2.0"
+					}
+				},
+				"typhonjs-escomplex-project": {
+					"version": "0.1.0",
+					"resolved": "https://registry.npmjs.org/typhonjs-escomplex-project/-/typhonjs-escomplex-project-0.1.0.tgz",
+					"integrity": "sha512-2NdkUsDmxcgsNFqn14CYl5Xfzlig7kKtU/ACOLRN6/nP9c3rlHizVr8YdBYRf2H1sOjmjfNmbC6i1RVnnJZxZQ==",
+					"dev": true,
+					"requires": {
+						"escomplex-plugin-metrics-project": "^0.1.0",
+						"typhonjs-escomplex-commons": "^0.1.0",
+						"typhonjs-escomplex-module": "^0.1.0",
+						"typhonjs-plugin-manager": "^0.2.0"
+					}
+				},
+				"typhonjs-plugin-manager": {
+					"version": "0.2.0",
+					"resolved": "https://registry.npmjs.org/typhonjs-plugin-manager/-/typhonjs-plugin-manager-0.2.0.tgz",
+					"integrity": "sha512-Plo2Z8jGLNlhoVOUFU5Dm2Vj/rjnaZycCSdklFeVXq3/+qo6k855Aya0WrkLTdjdj+spes60mRXyQnxHxXcHUQ==",
+					"dev": true,
+					"requires": {
+						"babel-runtime": "^6.0.0",
+						"backbone-esnext-events": "<1.0.0",
+						"typhonjs-object-util": "^0.4.0"
+					}
+				},
+				"yargs": {
+					"version": "16.2.0",
+					"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+					"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+					"dev": true,
+					"requires": {
+						"cliui": "^7.0.2",
+						"escalade": "^3.1.1",
+						"get-caller-file": "^2.0.5",
+						"require-directory": "^2.1.1",
+						"string-width": "^4.2.0",
+						"y18n": "^5.0.5",
+						"yargs-parser": "^20.2.2"
+					}
+				}
+			}
+		},
 		"color-convert": {
 			"version": "1.9.3",
 			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -12819,6 +14084,12 @@
 				"keygrip": "~1.1.0"
 			}
 		},
+		"core-js": {
+			"version": "2.6.12",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+			"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+			"dev": true
+		},
 		"cosmiconfig": {
 			"version": "7.1.0",
 			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@@ -13010,6 +14281,18 @@
 			"integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==",
 			"dev": true
 		},
+		"dotdir-regex": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/dotdir-regex/-/dotdir-regex-1.0.1.tgz",
+			"integrity": "sha512-kdFn3THtHoTIRKKaGXxKgsWD1VEcoWTjts+EX8qY+ydvMC3GjxWvcu5mclkXBTO9eDJkEYhJV4uF9PpaTgIHVw==",
+			"dev": true
+		},
+		"dotfile-regex": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/dotfile-regex/-/dotfile-regex-0.1.2.tgz",
+			"integrity": "sha512-/aYlowqO6BnhSQC+snSjl7pdlDRngDVx69cr03Wv3oTJM4k+9L453pPsMeGRKwm0HmwNG+TncX2OZenSIF14iw==",
+			"dev": true
+		},
 		"eastasianwidth": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -13033,8 +14316,7 @@
 			"version": "1.4.271",
 			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.271.tgz",
 			"integrity": "sha512-BCPBtK07xR1/uY2HFDtl3wK2De66AW4MSiPlLrnPNxKC/Qhccxd59W73654S3y6Rb/k3hmuGJOBnhjfoutetXA==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"emittery": {
 			"version": "1.0.1",
@@ -14613,6 +15895,23 @@
 			"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
 			"dev": true
 		},
+		"flow-parser": {
+			"version": "0.194.0",
+			"resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.194.0.tgz",
+			"integrity": "sha512-3dipGWKnXmE4LEE5yCPHJrSlMYOPAYU7wMBecfKiWPQSZp1CvkpJ59dfuuUIeM2TSttKGSatep77vGG9cjkeqg==",
+			"dev": true
+		},
+		"flow-remove-types": {
+			"version": "2.194.0",
+			"resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.194.0.tgz",
+			"integrity": "sha512-/tkRSpCkjas9c2IZblDAgvAyd8atLYAHcenwupaRNiZGQva6tNjOHw7nj5kR+C4n2lvxQdrAs1jpZoD1ziN04g==",
+			"dev": true,
+			"requires": {
+				"flow-parser": "^0.194.0",
+				"pirates": "^3.0.2",
+				"vlq": "^0.2.1"
+			}
+		},
 		"foreground-child": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
@@ -14684,6 +15983,12 @@
 			"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
 			"dev": true
 		},
+		"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",
@@ -15222,6 +16527,24 @@
 			"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
 			"dev": true
 		},
+		"is-dotdir": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-dotdir/-/is-dotdir-1.0.1.tgz",
+			"integrity": "sha512-ilM6A5vLGu0Gtma06HS9a9nnrxXF3ElJGqWuG3nBL+R/LwUcgS0FpQDurMrWO11QhOHdlejEBTfPWhIwV9xikQ==",
+			"dev": true,
+			"requires": {
+				"dotdir-regex": "^1.0.1"
+			}
+		},
+		"is-dotfile": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-2.0.0.tgz",
+			"integrity": "sha512-51SpFowbv7bHGrAJ9u+eqitdXZFPrr9m9vEzN3YGkN8XpYN0RF/6s7l8rQgyuBbNjeq8DPvpG6t3y3ZjUSHVDg==",
+			"dev": true,
+			"requires": {
+				"dotfile-regex": "^0.1.2"
+			}
+		},
 		"is-error": {
 			"version": "2.2.2",
 			"resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz",
@@ -16327,12 +17650,17 @@
 				"whatwg-url": "^5.0.0"
 			}
 		},
+		"node-modules-regexp": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+			"integrity": "sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==",
+			"dev": true
+		},
 		"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,
-			"peer": true
+			"dev": true
 		},
 		"nofilter": {
 			"version": "3.1.0",
@@ -16805,8 +18133,7 @@
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
 			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"picomatch": {
 			"version": "2.3.1",
@@ -16826,6 +18153,15 @@
 			"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
 			"dev": true
 		},
+		"pirates": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz",
+			"integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==",
+			"dev": true,
+			"requires": {
+				"node-modules-regexp": "^1.0.0"
+			}
+		},
 		"pkg-conf": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz",
@@ -17312,6 +18648,12 @@
 				}
 			}
 		},
+		"regenerator-runtime": {
+			"version": "0.11.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+			"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+			"dev": true
+		},
 		"regexp-tree": {
 			"version": "0.1.24",
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
@@ -18239,6 +19581,15 @@
 				"typhonjs-plugin-manager": "^0.0.3"
 			}
 		},
+		"typhonjs-object-util": {
+			"version": "0.4.2",
+			"resolved": "https://registry.npmjs.org/typhonjs-object-util/-/typhonjs-object-util-0.4.2.tgz",
+			"integrity": "sha512-qs4Mn45ryJBNbXQ+QV1vvz4h0c0ED5my+XFo5Kp5iEIbA3KGuJZjI5AEAucfPLEX6VDZ2eJQqMkrstxLY5jTdw==",
+			"dev": true,
+			"requires": {
+				"babel-runtime": "^6.0.0"
+			}
+		},
 		"typhonjs-plugin-manager": {
 			"version": "0.0.3",
 			"resolved": "https://registry.npmjs.org/typhonjs-plugin-manager/-/typhonjs-plugin-manager-0.0.3.tgz",
@@ -18294,7 +19645,6 @@
 			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz",
 			"integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==",
 			"dev": true,
-			"peer": true,
 			"requires": {
 				"escalade": "^3.1.1",
 				"picocolors": "^1.0.0"
@@ -18348,6 +19698,12 @@
 			"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
 			"dev": true
 		},
+		"vlq": {
+			"version": "0.2.3",
+			"resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+			"integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+			"dev": true
+		},
 		"void-elements": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
diff --git a/package.json b/package.json
index 323ff43e6883012bcfba083741ba0fa277c1f7c6..444c93831152b06a1039a7c15ee4a00890f5e07b 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
 		"xtest:dev:qualityCheck": "xo",
 		"test:dev:duplication": "jscpd ./ -s",
 		"test:dev:runTests": "ava src/**.test.mjs",
-		"xtest:dev:complexity": "codehawk ./",
+		"test:dev:complexity": "codehawk ./",
 		"test-e2e": "ava generated/tmpNodejs/**.test-e2e.mjs",
 		"test:production": "run-s test:production:**",
 		"xtest:production:qualityCheck": "xo",
@@ -55,6 +55,7 @@
 		"browser-ava": "^1.1.0",
 		"c8": "^7.12.0",
 		"chokidar-cli": "^3.0.0",
+		"codehawk-cli": "^10.0.1",
 		"es6-plato": "https://github.com/1000i100/es6-plato#master",
 		"esbuild": "^0.15.15",
 		"eslint-plugin-ava": "^13.2.0",